Download as pdf or txt
Download as pdf or txt
You are on page 1of 49

Translated from English to Ukrainian - www.onlinedoctranslator.

com

НЕОБХІДНІ ІНСТРУМЕНТИ ДЛЯ РОБОТИ З ДАНИМИ

на основі

Джейк ВандерПлас

www.allitebooks.com
www.allitebooks.com
Довідник з вивчення даних Python
Основні інструменти для роботи з даними

Джейк ВандерПлас

Пекін Бостон Фарнем Севастополь Токіо

www.allitebooks.com
Довідник з вивчення даних Python

Джейком Вандерпласом

Авторське право © 2017 Джейк ВандерПлас. Всі права захищені.

Надруковано в Сполучених Штатах Америки.

Опубліковано O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472.

Книги O'Reilly можна придбати для освітніх, ділових або рекламних цілей. Для більшості назв також доступні онлайн-
видання (http://oreilly.com/safari). Щоб отримати додаткову інформацію, зверніться до нашого корпоративного/
інституційного відділу продажів: 800-998-9938 абоcorporate@oreilly.com.

редактор:Світанок Шанафельт Індексатор:WordCo Indexing Services, Inc.


Редактор виробництва:Крістен Браун Дизайнер інтер'єру:Девід Футато
Редактор:Жасмин Квітин Дизайнер обкладинки:Карен Монтгомері
Коректор:Рейчел Монаган Ілюстратор:Ребекка Демарест

Грудень 2016: Перше видання

Історія редакцій для першого видання

2016-11-17: Перший випуск

Побачитиhttp://oreilly.com/catalog/errata.csp?isbn=9781491912058для деталей випуску.

Логотип O'Reilly є зареєстрованою торговою маркою O'Reilly Media, Inc.Довідник з вивчення даних Python, зображення
обкладинки та пов’язаний торговий вигляд є торговими марками O’Reilly Media, Inc.

Незважаючи на те, що видавець і автор сумлінно доклали зусиль, щоб забезпечити точність інформації та
інструкцій, що містяться в цьому творі, видавець і автор відмовляються від будь-якої відповідальності за
помилки або упущення, включаючи, без обмежень, відповідальність за збитки, спричинені використанням або
опора на цю роботу. Використовуйте інформацію та інструкції, що містяться в цій роботі, на власний ризик.
Якщо будь-які зразки коду чи інші технології, які містить або описує ця робота, підпадають під дію ліцензій з
відкритим кодом або прав інтелектуальної власності інших осіб, ви несете відповідальність за те, щоб їх
використання вами відповідало таким ліцензіям і/або правам.

978-1-491-91205-8

[LSI]

www.allitebooks.com
Зміст

Передмова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi

1.IPython: поза звичайним Python. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


Оболонка чи блокнот? 2
Запуск оболонки IPython 2
Запуск довідки та документації 2
Jupyter Notebook у IPython 3
Доступ до документації за допомогою ? Доступ до 3
вихідного коду за допомогою ?? Вивчення модулів за 5
допомогою комбінацій клавіш завершення табуляції 6
в оболонці IPython 8
Швидкі клавіші навігації 8
Комбінації клавіш для введення тексту 9
Ярлики історії команд 9
Різні ярлики IPython 10
Magic Commands 10
Вставлення блоків коду: %paste та %cpaste 11
Запуск зовнішнього коду: %run 12
Час виконання коду: %timeit 12
Довідка щодо магічних функцій: ?, %magic і %lsmagic 13
Історія введення та виведення 13
Вхідні та вихідні об’єкти IPython підкреслюють 13
ярлики та попередні виходи, що пригнічують 15
виведення 15
Пов’язані магічні команди 16
Команди IPython і Shell 16
Короткий вступ до команд 16
оболонки оболонки в IPython 18

iii

www.allitebooks.com
Передача значень до та з Shell 18
Помилки та налагодження магічних 19
команд, пов’язаних із Shell 20
Керування винятками: %xmode 20
Налагодження: коли читання Tracebacks недостатньо, 22
профілювання та синхронізація коду 25
Фрагменти коду синхронізації: %timeit і %time Повні 25
сценарії профілювання: %prun 27
Построкове профілювання за допомогою %lprun 28
Профілювання Використання пам’яті: %memit і %mprun 29
Більше ресурсів IPython 30
Веб-ресурси 30
Книги 31

2.Знайомство з NumPy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Розуміння типів даних у Python 34
Ціле число Python — це більше, ніж просто ціле число 35
Список Python — це більше, ніж просто список Масиви 37
фіксованого типу в Python 38
Створення масивів зі списків 39
Python Створення масивів з нуля 39
Стандартні типи даних NumPy 41
Основи масивів NumPy 42
Атрибути масиву NumPy 42
Індексування масиву: доступ до окремих елементів, 43
нарізка масиву: доступ до підмасивів, зміна форми 44
масивів 47
Обчислення конкатенації та розбиття масивів на 48
масивах NumPy: універсальні функції 50
Повільність циклів. 50
Знайомство з UFuncs 51
Вивчення NumPy UFuncs 52
Розширені функції Ufunc 56
Ufuncs: Докладніше 58
Агрегації: мінімальна, максимальна та все між ними 58
Підсумовування значень 59
мінімуму та максимуму масиву 59
Приклад: який середній зріст президентів США? 61
Обчислення на масивах: трансляція 63
Ознайомлення з 63
Правилами мовлення 65
Мовлення на практиці 68

iv | Зміст

www.allitebooks.com
Порівняння, маски та булева логіка 70
Приклад: Оператори порівняння 70
підрахунку дощових днів як ufuncs 71
Робота з логічними масивами 73
Логічні масиви як маски 75
Модне індексування 78
Вивчення модного індексування 79
Комбіноване індексування 80
Приклад: вибір випадкових точок, зміна значень 81
за допомогою фантастичного індексування. 82
Приклад: групування даних 83
Сортування масивів 85
Швидке сортування в NumPy: np.sort і np.argsort 86
Часткове сортування: розділення 88
Приклад: k-найближчі сусіди. Структуровані 88
дані: структуровані масиви NumPy 92
Створення структурованих масивів Досконаліші 94
складені типи RecordArrays: структуровані 95
масиви з доповненням до Pandas 96
96

3.Маніпулювання даними за допомогою Pandas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97


Встановлення та використання Pandas 97
Знайомство з об’єктами Pandas 98
Об’єкт Pandas Series Об’єкт 99
Pandas DataFrame Об’єкт 102
Pandas Index Індексування 105
та вибір даних 107
Вибір даних у серії Вибір 107
даних у DataFrame 110
Операції з даними в Pandas 115
Ufuncs: збереження індексу 115
UFuncs: вирівнювання індексу 116
Ufuncs: операції між DataFrame і серією 118
обробки відсутніх даних 119
Компроміси в угодах про відсутні дані 120
Відсутні дані в Pandas 120
Робота з ієрархічним 124
індексуванням нульових значень 128
Багатоіндексована серія. Методи 128
створення мультиіндексу. Індексація 131
та нарізка мультиіндексу. 134

Зміст | v

www.allitebooks.com
Перевпорядкування агрегацій даних із кількома 137
індексами на об’єднання наборів даних з кількома 140
індексами: Concat і Append 141
Нагадуємо: конкатенація масивів NumPy. Проста 142
конкатенація за допомогою pd.concat. 142
Об’єднання наборів даних: злиття та об’єднання 146
Реляційна алгебра 146
Категорії об'єднань 147
Специфікація ключа злиття, що визначає арифметику набору 149
для з’єднань. Назви стовпців, що перекриваються: суфікси. 152
Приклад ключового слова: дані штатів США 153
154
Агрегація та групування 158
Дані планет 159
Просте агрегування в Pandas GroupBy: 159
розділення, застосування, об’єднання 161
зведених таблиць 170
Мотивація зведених таблиць 170
Зведені таблиці вручну Синтаксис 171
зведених таблиць 171
Приклад: векторизовані рядкові 174
операції з даними народжуваності 178
Знайомство з таблицями операцій із рядками 178
Pandas із методами рядків Pandas. Приклад: 180
база даних рецептів 184
Робота з часовими рядами 188
Дати та час у часових рядах Python 188
Pandas: індексація за часовими рядами 192
Time Pandas Структури даних Частоти та 192
зміщення 195
Повторна дискретизація, зміщення та вікна 196
Де дізнатися більше 202
Приклад: Візуалізація велосипедів у Сіетлі. 202
Високопродуктивні Pandas: eval() і query() 208
Мотивація query() і eval(): складені вирази 209
pandas.eval() для ефективних операцій 210
DataFrame.eval() для операцій по стовпцях 211
Метод DataFrame.query() 213
Продуктивність: коли використовувати ці функції 214
Додаткові ресурси 215

vi | Зміст

www.allitebooks.com
4.Візуалізація за допомогою Matplotlib. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Загальні поради Matplotlib 218
Імпорт matplotlib 218
Налаштування стилів 218
show() чи No show()? Як відобразити ваші графіки, 218
зберігаючи фігури у файлі 221
Два інтерфейси за ціною однієї 222
простої лінії 224
Налаштування графіка: кольори та стилі ліній 226
Налаштування графіка: межі осей 228
Ділянки маркування 230
Прості діаграми розсіювання 233
Точкові діаграми з plt.plot 233
Точкові діаграми з plt.scatter 235
plot Versus scatter: A Note on Efficiency 237
Visualizing Errors 237
Основні панелі помилок 238
Постійні помилки 239
Щільність і контурні графіки 241
Візуалізація гістограм тривимірної 241
функції, бінінгів і щільності 245
Двовимірні гістограми та бінінги 247
Налаштування легенд графіків 249
Вибір елементів для легенди 251
Легенда для розміру точок 252
Кілька легенд 254
Налаштування кольорових панелей 255
Налаштування кольорових панелей 256
Приклад: Рукописні цифри з 261
кількома підрозділами 262
plt.axes: Підсхеми вручну plt.subplot: Прості 263
сітки підсхем plt.subplots: Вся сітка за один 264
раз plt.GridSpec: Більш складні схеми 265
розташування Текст і анотація 266
268
Приклад: зміна впливу свят на народження 269
в США та розміщення тексту 270
Стрілки та анотація 272
Налаштування галочок 275
Основні та другорядні позначки, що 276
приховують галочки або мітки 277
Зменшення або збільшення кількості позначок 278

Зміст | vii

www.allitebooks.com
Модні формати Tick 279
Короткий опис форматувальників і локаторів Налаштування 281
Matplotlib: конфігурації та таблиці стилів 282
Налаштування графіка вручну, змінюючи 282
значення за замовчуванням: таблиці стилів 284
rcParams 285
Тривимірне малювання в Matplotlib 290
Тривимірні точки та лінії 291
Тривимірні контурні графіки 292
Каркаси та поверхневі графіки 293
Поверхневі тріангуляції 295
Географічні дані з базовою картою 298
Картографічні проекції 300
Створення фону карти 304
Нанесення даних на карти 307
Приклад: міста Каліфорнії Приклад: 308
Візуалізація даних про температуру 309
поверхні за допомогою Seaborn 311
Seaborn проти Matplotlib 312
Дослідження сюжетів Seaborn 313
Приклад: Вивчення часу фінішу марафону 322
Додаткові ресурси 329
Ресурси Matplotlib 329
Інші графічні бібліотеки Python 330

5.Машинне навчання. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331


Що таке машинне навчання? 332
Категорії машинного навчання 332
Якісні приклади застосування машинного навчання 333
Резюме 342
Представляємо Scikit-Learn 343
Представлення даних в Scikit-Learn 343
API оцінювача Scikit-Learn 346
Застосування: Вивчення рукописних цифр. 354
Підсумок 359
Гіперпараметри та перевірка моделі 359
Роздум про перевірку моделі. 359
Вибір найкращої моделі 363
Криві навчання 370
Валідація на практиці: Резюме 373
пошуку в сітці 375
Розробка функцій 375

viii | Зміст

www.allitebooks.com
Категориальні ознаки 376
Особливості тексту 377
Особливості зображення 378
Похідні функції 378
Імпутація відсутніх конвеєрів 381
функцій даних 381
Поглиблено: наївна класифікація Байєса 382
Байєсовська класифікація 383
Гаусівський наївний Байєс 383
Багаточлен наївного Байєса 386
Коли використовувати наївний 389
Байєс у глибині: лінійна регресія 390
Регуляризація базисної 390
функції простої лінійної 392
регресії 396
Приклад: поглиблене прогнозування 400
велосипедного трафіку: векторні машини підтримки 405
Мотиваційні машини опорних векторів Машини 405
опорних векторів: максимізація маржі Приклад: 407
розпізнавання облич 416
Поглиблене резюме опорних векторних 420
машин: дерева рішень і випадкові ліси 421
Мотивація випадкових лісів: дерева рішень, 421
ансамблі оцінювачів: випадкові ліси, 426
регресія випадкового лісу 428
Приклад: випадковий ліс для класифікації 430
цифр. Підсумок випадкових лісів 432
Поглиблено: аналіз основних компонентів 433
Представляємо аналіз основних компонентів PCA 433
як фільтрацію шуму 440
Приклад: власні грані 442
Поглиблений підсумок аналізу основних 445
компонентів: різноманітне навчання 445
Навчання різновидів: “HELLO” багатовимірне 446
масштабування (MDS) MDS як навчання різноманіття 447
Нелінійні вбудовування: де MDS не вдається Нелінійні 450
різновиди: локально лінійне вбудовування Деякі думки 452
щодо методів різноманіття 453
455
Приклад: Ізомапа на гранях Приклад: 456
Візуалізація структури цифр у глибині: 460
кластеризація k-середніх 462

Зміст | ix
Представляємо k-середні 463
Алгоритм k-середніх: приклади очікування– 465
максимізації 470
Поглиблено: моделі сумішей Гауса 476
Мотивація GMM: слабкі сторони k-середніх. 477
Узагальнення E–M: моделі суміші Гаусса. 480
GMM як оцінка щільності 484
Приклад: GMM для створення нових 488
даних у глибині: Оцінка щільності ядра 491
Мотивація KDE: Гістограми Оцінка 491
щільності ядра на практиці 496
Приклад: KDE на сфері 498
Приклад: не дуже наївна програма Баєса: 501
конвеєр розпізнавання облич 506
Особливості HOG 506
HOG в дії: простий детектор обличчя 507
Застереження та вдосконалення 512
Додаткові ресурси машинного навчання 514
Машинне навчання в Python 514
Загальне машинне навчання 515

Індекс. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517

х | Зміст
Передмова

Що таке Data Science?


Це книга про дослідження даних за допомогою Python, яка одразу викликає запитання: що таке
наука про дані? Напрочуд складно дати визначення, особливо враховуючи, наскільки
повсюдним став цей термін. Критики по-різному відкидають цей термін як зайвий ярлик
(зрештою, яка наука не пов’язана з даними?) або просте модне слово, яке існує лише для того,
щоб підфарбовувати резюме та привертати увагу надмірно завзятих рекрутерів у сфері
технологій.

На мою думку, ця критика упускає щось важливе. Наука про дані, незважаючи на її ажіотажний
вигляд, є, мабуть, найкращою маркою для міждисциплінарного набору навичок, які стають
дедалі важливішими в багатьох сферах застосування в промисловості та академічних колах. Ця
міждисциплінарна частина є ключовою: на мою думку, найкраще існуюче визначення науки про
дані проілюстровано діаграмою Венна Data Science Дрю Конвея, вперше опублікованою в його
блозі у вересні 2010 року (див.Малюнок П-1).

Малюнок П-1. Діаграма Венна Data Science Дрю Конвея

xi
Хоча деякі мітки перетину є дещо нахабними, ця діаграма відображає суть того, що, на мою
думку, люди мають на увазі, коли кажуть «наука про дані»: це фундаментально
міждисциплінарнийтема. Наука про дані складається з трьох різних областей, що
перетинаються: навички астатистхто вміє моделювати та узагальнювати набори даних (які
стають все більшими); навички aінформатикхто може розробляти та використовувати
алгоритми для ефективного зберігання, обробки та візуалізації цих даних; і предметна
експертиза— те, що ми можемо вважати «класичним» навчанням предмету — необхідне як для
формулювання правильних запитань, так і для постановки відповідей на них у контексті.

Зважаючи на це, я б заохотив вас розглядати науку про дані не як про нову сферу знань, яку
потрібно вивчати, а як про новий набір навичок, які ви можете застосувати у своїй поточній
сфері знань. Незалежно від того, чи ви звітуєте про результати виборів, прогнозуєте
прибутковість акцій, оптимізуєте кліки онлайн-реклами, ідентифікуєте мікроорганізми на
фотографіях під мікроскопом, шукаєте нові класи астрономічних об’єктів чи працюєте з даними в
будь-якій іншій галузі, ціль цієї книги — дати вам можливість ставте та відповідайте на нові
запитання щодо обраної предметної області.

Для кого ця книга?


Під час мого викладання як у Вашингтонському університеті, так і на різноманітних технічних
конференціях і зустрічах одним із найпоширеніших запитань, які я чув, є таке: «Як мені вивчити
Python?» Люди, які запитують, — це, як правило, технічно налаштовані студенти, розробники
або дослідники, часто вже з великим досвідом написання коду та використання
обчислювальних і чисельних інструментів. Більшість із цих людей не хочуть вивчати Python як
таку, а хочуть вивчати мову з метою використання її як інструменту для інтенсивних даних та
обчислювальної науки. Незважаючи на те, що в Інтернеті доступна велика кількість відео,
публікацій у блогах і навчальних посібників для цієї аудиторії, я довго був розчарований
відсутністю єдиної хорошої відповіді на це запитання; це те, що надихнуло цю книгу.

Книга не призначена для знайомства з Python або програмуванням загалом; Я припускаю, що


читач знайомий із мовою Python, включаючи визначення функцій, призначення змінних,
виклик методів об’єктів, керування потоком програми та інші основні завдання. Натомість він
призначений для того, щоб допомогти користувачам Python навчитися використовувати стек
Python для вивчення даних — такі бібліотеки, як IPython, NumPy, Pandas, Matplotlib, Scikit-Learn і
пов’язані інструменти — для ефективного зберігання даних, обробки та отримання інформації з
них.

Чому саме Python?

За останні кілька десятиліть Python став першокласним інструментом для наукових


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

xii | Передмова
Корисність Python для науки про дані зумовлена насамперед великою та активною
екосистемою пакетів сторонніх розробників: NumPy для обробки однорідних даних на
основі масивів, Pandas для обробки різнорідних і позначених даних, SciPy для звичайних
наукових обчислювальних завдань, Matplotlib для публікації якості візуалізації, IPython для
інтерактивного виконання та спільного використання коду, Scikit-Learn для машинного
навчання та багато інших інструментів, які будуть згадані на наступних сторінках.

Якщо ви шукаєте посібник із самої мови Python, я б запропонував дочірній проект


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

Python 2 проти Python 3


У цій книзі використовується синтаксис Python 3, який містить удосконалення мови, несумісні з
серією Python 2.x. Хоча Python 3.0 було вперше випущено в 2008 році, його впровадження
відбувалося відносно повільно, особливо в наукових спільнотах і спільнотах веб-розробників. Це
пов’язано насамперед з тим, що знадобився деякий час, щоб багато важливих пакетів і
інструментів сторонніх виробників стали сумісними з новою внутрішньою мовою. Однак з
початку 2014 року стабільні випуски найважливіших інструментів екосистеми обробки даних
повністю сумісні з Python 2 і 3, тому в цій книзі використовуватиметься новіший синтаксис
Python 3. Однак переважна більшість фрагментів коду в цій книзі також працюватиме без змін у
Python 2: у випадках, коли використовується синтаксис, несумісний з Py2, я докладу всіх зусиль,
щоб це чітко зазначити.

План цієї книги


Кожен розділ цієї книги присвячений конкретному пакету чи інструменту, який є
фундаментальною частиною історії Python.

IPython і Jupyter (Розділ 1)


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

NumPy (Розділ 2)
Ця бібліотека надаєndarrayоб’єкт для ефективного зберігання та обробки щільних
масивів даних у Python.

панди (Розділ 3)
Ця бібліотека надаєDataFrameоб’єкт для ефективного зберігання та маніпулювання
даними з мітками/стовпцями в Python.

Matplotlib (Розділ 4)
Ця бібліотека надає можливості для гнучкого діапазону візуалізацій даних у
Python.

Передмова | xiii
Scikit-Learn (Розділ 5)
Ця бібліотека забезпечує ефективні та чисті реалізації Python
найважливіших і визнаних алгоритмів машинного навчання.

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

Використання прикладів коду

Додаткові матеріали (приклади коду, малюнки тощо) доступні для завантаження за


адресою https://github.com/jakevdp/PythonDataScienceHandbook. Ця книга тут, щоб
допомогти вам виконати вашу роботу. Загалом, якщо з цією книгою пропонується приклад
коду, ви можете використовувати його у своїх програмах і документації. Вам не потрібно
звертатися до нас за дозволом, якщо ви не відтворюєте значну частину коду. Наприклад,
для написання програми, яка використовує декілька фрагментів коду з цієї книги, дозвіл
не потрібен. Для продажу або розповсюдження компакт-диска з прикладами з книг О'Райлі
потрібен дозвіл. Щоб відповісти на запитання, цитуючи цю книгу та цитуючи приклад
коду, дозвіл не потрібен. Включення значної кількості прикладів коду з цієї книги в
документацію вашого продукту вимагає дозволу.

Ми цінуємо, але не вимагаємо зазначення авторства. Атрибуція зазвичай містить назву,


автора, видавця та ISBN. Наприклад, "Довідник з вивчення даних PythonДжейком
Вандерпласом (О'Райлі). Авторське право 2017 Джейк ВандерПлас, 978-1-491-91205-8.»

Якщо ви вважаєте, що використання вами прикладів коду виходить за межі добросовісного використання або дозволу,

наведеного вище, зв’яжіться з нами за адресоюpermissions@oreilly.com.

Рекомендації щодо встановлення

Встановити Python і набір бібліотек, які забезпечують наукові обчислення, дуже


просто. У цьому розділі описано деякі міркування, про які слід пам’ятати під час
налаштування комп’ютера.

Хоча існують різні способи встановлення Python, я б запропонував для використання в науці про
дані дистрибутив Anaconda, який працює однаково незалежно від того, чи використовуєте ви
Windows, Linux або Mac OS X. Дистрибутив Anaconda доступний у двох варіантах:

• Мініконданадає вам сам інтерпретатор Python разом із інструментом командного


рядка під назвоюcondaякий працює як кросплатформний менеджер пакунків

xiv | Передмова
до пакетів Python, схожих за духом на інструменти apt або yum, з якими користувачі Linux
можуть бути знайомі.

• Анакондавключає як Python, так і conda, а також набір інших попередньо


встановлених пакетів, призначених для наукових обчислень. Через розмір
цього набору очікуйте, що інсталяція займе кілька гігабайт дискового
простору.

Будь-який із пакетів, що входять до складу Anaconda, також можна встановити вручну


поверх Miniconda; з цієї причини я пропоную почати з Miniconda.

Щоб почати, завантажте та інсталюйте пакет Miniconda (переконайтеся, що ви вибрали версію з


Python 3), а потім інсталюйте основні пакети, які використовуються в цій книзі:

[~]$ conda встановити numpy pandas scikit-learn matplotlib seaborn ipython-notebook

У тексті ми також будемо використовувати інші, більш спеціалізовані інструменти в науковій


екосистемі Python; встановлення зазвичай таке ж просте, як і введеннявстановлення conda
назва пакета. Для отримання додаткової інформації про conda, включаючи інформацію про
створення та використання середовищ conda (що я б хотіввисокорекомендувати), дивонлайнова
документація conda.

Умовні позначення, що використовуються в цій книзі

У цій книзі використовуються наступні типографічні позначення:

Курсив

Вказує на нові терміни, URL-адреси, адреси електронної пошти, імена файлів і розширення файлів.

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

Жирний шрифт постійної ширини

Показує команди або інший текст, який повинен буквально вводити користувач.

Курсив постійної ширини


Показує текст, який слід замінити значеннями, наданими користувачем, або значеннями,
визначеними контекстом.

Сафарі О'Рейлі

Сафарі(раніше Safari Books Online) — це навчальна та


довідкова платформа для підприємств, уряду,
викладачів та окремих осіб.

Передмова | xv
Учасники мають доступ до тисяч книг, навчальних відео, навчальних маршрутів,
інтерактивних посібників і підібраних списків відтворення від понад 250 видавців,
зокрема O'Reilly Media, Harvard Business Review, Prentice Hall Professional, Addison-
Wesley Professional, Microsoft Press , Sams, Que, Peachpit Press, Adobe, Focal Press,
Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe
Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Бартлетт і Course
Technology, серед інших.

Для отримання додаткової інформації відвідайтеhttp://oreilly.com/safari.

Як з нами зв'язатися

Будь ласка, звертайтеся з коментарями та запитаннями щодо цієї книги до видавництва:

O'Reilly Media, Inc.


1005 Gravenstein Highway North
Sebastopol, CA 95472
800-998-9938 (у Сполучених Штатах або Канаді)
707-829-0515 (міжнародний або місцевий)
707-829-0104 (факс)

У нас є веб-сторінка для цієї книги, де ми перераховуємо помилки, приклади та будь-яку додаткову інформацію.
Ви можете отримати доступ до цієї сторінки за адресоюhttp://bit.ly/python-data-sci-handbook.

Щоб прокоментувати чи поставити технічні запитання щодо цієї книги, надішліть електронний лист на адресуbookques‐

tions@oreilly.com.

Для отримання додаткової інформації про наші книги, курси, конференції та новини відвідайте наш веб-сайт за
адресоюhttp://www.oreilly.com.

Знайдіть нас на Facebook:http://facebook.com/oreilly Слідкуйте за

нами в Twitter:http://twitter.com/oreillymedia Дивіться нас на

YouTube:http://www.youtube.com/oreillymedia

xvi | Передмова
РОЗДІЛ 1

IPython: поза звичайним Python

Існує багато варіантів середовищ розробки для Python, і мене часто запитують, яке з них я
використовую у власній роботі. Моя відповідь іноді дивує людей: моє улюблене середовище
IPythonплюс текстовий редактор (у моєму випадку Emacs або Atom залежно від мого настрою).
IPython (скорочення відІнтерактивний Python) був започаткований у 2001 році Фернандо
Пересом як розширений інтерпретатор Python і з тих пір переріс у проект, метою якого є
надання, за словами Переса, «інструментів для всього життєвого циклу дослідницького
обчислення». Якщо Python є двигуном нашого завдання з вивчення даних, ви можете думати
про IPython як про інтерактивну панель керування.

Крім того, що IPython є корисним інтерактивним інтерфейсом для Python, він


також надає низку корисних синтаксичних доповнень до мови; ми розглянемо
найкорисніші з цих доповнень тут. Крім того, IPython тісно пов'язаний зПроект
Юпітер, який надає блокнот на основі браузера, корисний для розробки,
співпраці, обміну та навіть публікації результатів наукових досліджень даних.
Блокнот IPython насправді є окремим випадком ширшої структури блокнота
Jupyter, який охоплює блокноти для Julia, R та інших мов програмування. Як
приклад корисності формату блокнота дивіться лише на сторінку, яку ви читаєте:
увесь рукопис цієї книги було складено як набір блокнотів IPython.

IPython — це ефективне використання Python для інтерактивних наукових обчислень і


обчислень із інтенсивним використанням даних. Цей розділ розпочнеться з покрокового опису
деяких функцій IPython, які є корисними для практики обробки даних, зосереджуючись
особливо на синтаксисі, який він пропонує за межами стандартних функцій Python. Далі ми
детальніше розглянемо деякі корисніші «магічні команди», які можуть пришвидшити типові
завдання зі створення та використання наукового коду даних. Нарешті, ми торкнемося деяких
функцій блокнота, які роблять його корисним для розуміння даних і обміну результатами.

1
Оболонка чи блокнот?

Є два основні засоби використання IPython, які ми обговоримо в цій главі:


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

Запуск оболонки IPython


Цей розділ, як і більшість цієї книги, не призначений для пасивного вивчення. Я рекомендую,
щоб, читаючи це, ви слідкували за текстом і експериментували з інструментами та синтаксисом,
які ми розглядаємо: м’язова пам’ять, яку ви розвиваєте завдяки цьому, буде набагато
кориснішою, ніж просте читання про це. Почніть із запуску інтерпретатора IPython, ввівши текст
ipythonв командному рядку; альтернативно, якщо ви встановили такий дистрибутив, як
Anaconda або EPD, може бути програма запуску, специфічна для вашої системи (ми розглянемо
це докладніше в«Довідка та документація в IPython» на сторінці 3).

Після того, як ви це зробите, ви повинні побачити таке повідомлення:

IPython 4.0.1 – покращений інтерактивний Python. ?


- > Введення та огляд можливостей IPython.
%quickref -> Швидка довідка.
допомогти - > Власна довідкова система Python.
об'єкт? - > Подробиці про "об'єкт", використовуйте "об'єкт??" для додаткових деталей.
В [1]:

З цим ви готові продовжувати.

Запуск Jupyter Notebook


Ноутбук Jupyter — це графічний інтерфейс на основі браузера до оболонки IPython, на основі
якого створено багатий набір можливостей динамічного відображення. Окрім виконання
операторів Python/IPython, блокнот дозволяє користувачеві додавати форматований текст,
статичні та динамічні візуалізації, математичні рівняння, віджети JavaScript та багато іншого.
Крім того, ці документи можна зберегти таким чином, щоб інші люди могли відкривати їх і
виконувати код у своїх системах.

Хоча блокнот IPython можна переглядати та редагувати у вікні веб-браузера, він має
підключитися до запущеного процесу Python, щоб виконати код. Щоб розпочати цей
процес (відомий як «ядро»), виконайте таку команду в системній оболонці:

$jupyter блокнот

Ця команда запустить локальний веб-сервер, який буде видимим для вашого браузера. Він
негайно випльовує журнал, який показує, що він робить; цей журнал виглядатиме приблизно
так:

2 | Розділ 1: IPython: поза звичайним Python


$jupyter блокнот
[NotebookApp] Обслуговує блокноти з локального каталогу: /Users/jakevdp/...
[NotebookApp] 0 активних ядер
[NotebookApp] Блокнот IPython працює за адресою: http://localhost:8888/ [NotebookApp]
Використовуйте Control-C, щоб зупинити цей сервер і вимкнути всі ядра...

Після введення команди браузер за замовчуванням має автоматично відкритися та


перейти до вказаної локальної URL-адреси; точна адреса залежатиме від вашої системи.
Якщо браузер не відкривається автоматично, ви можете відкрити вікно та вручну відкрити
цю адресу (http://localhost:8888/у цьому прикладі).

Довідка та документація в IPython


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

Коли технічно налаштовану людину просять допомогти другові, члену сім’ї чи колезі з
комп’ютерною проблемою, у більшості випадків це не стільки питання знання відповіді,
скільки знання того, як швидко знайти невідому відповідь. У науці про дані це те ж саме:
веб-ресурси з можливістю пошуку, такі як онлайн-документація, ланцюжки списків
розсилки та відповіді Stack Overflow, містять величезну кількість інформації, навіть
(особливо?), якщо це тема, яку ви вже шукали раніше. Щоб бути ефективним практиком
науки про дані, потрібно не стільки запам’ятовувати інструмент чи команду, які ви повинні
використовувати для кожної можливої ситуації, скільки навчитися ефективно знаходити
інформацію, яку ви не знаєте, через веб-пошукову систему чи іншу засоби.

Однією з найкорисніших функцій IPython/Jupyter є скорочення розриву між користувачем і


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

• Як викликати цю функцію? Які в нього є аргументи та варіанти?


• Як виглядає вихідний код цього об’єкта Python?
• Що міститься в цьому імпортованому пакеті? Які атрибути чи методи має цей
об’єкт?

Тут ми обговоримо інструменти IPython для швидкого доступу до цієї інформації, а саме ?
характер для вивчення документації, ?? символів для вивчення вихідного коду та клавішу
Tab для автозавершення.

Доступ до документації за допомогою ?

Мова Python і її екосистема обробки даних створені з урахуванням користувачів,


і однією з них є доступ до документації. Кожен об’єкт Python містить

Довідка та документація в IPython | 3


посилання на рядок, відомий як aрядок документації, який у більшості випадків міститиме стислий опис
об’єкта та способи його використання. Python має вбудованийдопомога()функція, яка може отримати
доступ до цієї інформації та надрукувати результати. Наприклад, щоб переглянути документацію
вбудованогодовжинави можете зробити наступне:

в[1]:допомогти(довжина)
Допомога по буд-вфункціядовжинаввбудовані модулі:

довжина(...)
довжина(об'єкт)->ціле число

Повертає кількість елементів послідовностіабовідображення.

Залежно від вашого перекладача, ця інформація може відображатися як вбудований текст або в
окремому спливаючому вікні.

Оскільки пошук довідки щодо об’єкта є дуже поширеним і корисним, IPython


представляє ? символ як скорочення для доступу до цієї документації та іншої
відповідної інформації:

в[2]: довж?
Тип: вбудована_функція_або_метод
Строкова форма:<побудований-вфункціядовжина>
Простір імен: Вбудований Python
Документація:
довжина(об'єкт)->ціле число

Повертає кількість елементів послідовностіабовідображення.

Ця нотація працює практично для будь-чого, включаючи об’єктні методи:

в[3]:Л=[1,2,3] в[4]:
Л.вставка? Тип:
вбудована_функція_або_метод
Строкова форма:<побудований-вметод вставкиоб'єкт спискув0x1024b8ea8>
Документація: Л.вставка(індекс,об'єкт)--вставкаоб'єктперед індексом

або навіть самі об’єкти з документацією їхнього типу:


в[5]: Л?
Тип: список

Строкова форма: [1,2,3]


Довжина: 3
Документація:
список()->новий порожнійсписок
список(ітерований)->новийсписокініціалізовановідітерованийпредмети користувача

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

в[6]:захМайдан(a):
....: """Повернути квадрат а."""

4 | Розділ 1: IPython: поза звичайним Python


....: поверненняa**2
....:

Зауважте, що для створення рядка документації для нашої функції ми просто розмістили рядковий літерал у першому

рядку. Оскільки рядки документації зазвичай складаються з кількох рядків, за домовленістю ми використовували

позначення Python у потрійних лапках для багаторядкових рядків.

Тепер ми використаємо ? позначте, щоб знайти цей рядок документації:

в[7]: Майдан?
Тип: функція
Строкова форма:<функція квадрат при0x103713cb0>
Визначення: Майдан(a)
Документація: Поверніть квадрат a.

Цей швидкий доступ до документації через рядки документів є однією з причин, чому вам варто
виробити звичку завжди додавати таку вбудовану документацію до коду, який ви пишете!

Доступ до вихідного коду за допомогою ??

Оскільки мову Python дуже легко читати, зазвичай ви можете отримати інший
рівень розуміння, прочитавши вихідний код об’єкта, який вас цікавить. IPython
надає ярлик вихідного коду з подвійним знаком питання (??):
в[8]: Майдан??
Тип: функція
Строкова форма:<функція квадрат при0x103713cb0>
Визначення:Майдан(a) Джерело:

захМайдан(a):
"Повернути квадрат а"
поверненняa**2

Для таких простих функцій, як ця, подвійний знак питання може дати швидке
розуміння деталей під капотом.

Якщо ви багато пограєте з цим, ви помітите, що іноді ?? suffix не відображає жодного


вихідного коду: це, як правило, тому, що об’єкт, про який йде мова, реалізовано не на
Python, а на C або іншій скомпільованій мові розширення. Якщо це так, то ?? суфікс
дає той самий вихід, що й ? суфікс. Ви знайдете це, наприклад, у багатьох вбудованих
об’єктах і типах Pythonдовжиназверху:

в[9]: довж??
Тип: вбудована_функція_або_метод
Строкова форма:<побудований-вфункціядовжина>
Простір імен: Вбудований Python
Документація:
довжина(об'єкт)->ціле число

Повертає кількість елементів послідовностіабовідображення.

Довідка та документація в IPython | 5


Використовуючи ? та/або ?? надає потужний і швидкий інтерфейс для пошуку інформації про те, що
робить будь-яка функція або модуль Python.

Вивчення модулів із завершенням табуляції

Іншим корисним інтерфейсом IPython є використання клавіші Tab для автозаповнення та


дослідження вмісту об’єктів, модулів і просторів імен. У наведених нижче прикладах ми будемо
використовувати <TAB>щоб вказати, коли слід натиснути клавішу Tab.

Завершення вмісту об'єкта табуляцією

Кожен об’єкт Python має різні атрибути та методи, пов’язані з ним. Як і з


допомогтиPython має вбудовану функціюрежфункція, яка повертає їх список, але
інтерфейс завершення табуляції набагато легший у використанні на практиці.
Щоб переглянути список усіх доступних атрибутів об’єкта, ви можете ввести ім’я
об’єкта з крапкою (.) і клавішу Tab:
в[10]:Л.<TAB> Л.
додати L.копія Л.подовжити L.вставити L.видалити Л.сортувати
Л.ясно Л.граф Л.індекс L.поп Л.зворотний

Щоб звузити список, ви можете ввести перший символ або кілька символів
імені, і клавіша Tab знайде відповідні атрибути та методи:
в[10]:Л.в<TAB>
Л.ясно Л.копія Л.рахувати

в[10]:Л.співробітництво<TAB
> Л.копія Л.рахувати

Якщо є лише один варіант, натискання клавіші Tab завершить рядок за вас.
Наприклад, наступне буде миттєво замінено наL.count:
в[10]:Л.cou<TAB>

Хоча в Python немає чітко встановленої різниці між загальнодоступними/зовнішніми


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

в[10]:Л._<TAB> Л.
__додати__ Л.__gt__ Л.__зменшити__
Л.__клас__ Л.__хеш__ Л.__reduce_ex__

Для стислості ми показали лише перші пару рядків результату. Більшість із них є спеціальними
методами Python із подвійним підкресленням (часто званими методами “dunder”).

6 | Розділ 1: IPython: поза звичайним Python


Завершення табуляції під час імпорту

Завершення табуляції також корисне під час імпорту об’єктів із пакетів. Тут ми використаємо його, щоб
знайти всі можливі імпорти вitertoolsпакет, який починається зспівробітництво:

У [10]: з itertools імпортувати комбінації


co<TAB> компрес
комбінації_із_заміною рахувати

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

У [10]: імпортуйте <TAB>


Відобразити всі 399 можливостей? (y або n)
Крипто дис py_compile
Cython distutils pyclbr
... ... ...
difflib pwd zmq

У [10]: імпорт h<TAB>


hashlib hmac http
heapq html хусл
(Зауважте, що для стислості я не друкую тут усі 399 імпортованих пакетів і модулів у
моїй системі.)

За межами завершення табуляції: відповідність підстановкою

Завершення табуляції корисне, якщо ви знаєте кілька перших символів об’єкта чи атрибута, який
шукаєте, але мало допоможе, якщо ви хочете знайти відповідність символам у середині чи кінці слова.
Для цього випадку використання IPython надає засоби зіставлення символів підстановки для імен за
допомогою символу *.

Наприклад, ми можемо використовувати це, щоб перерахувати кожен об’єкт у просторі імен, який закінчується на

УВАГА:
в[10]: *УВАГА?
BytesWarning RuntimeWarning
DeprecationWarning SyntaxWarning
FutureWarning UnicodeWarning
ImportWarning UserWarning
PendingDeprecationWarning УВАГА
ResourceWarning

Зверніть увагу, що символ * відповідає будь-якому рядку, включаючи порожній рядок.

Аналогічно, припустімо, що ми шукаємо рядковий метод, який містить словознайти


десь у своїй назві. Ми можемо шукати це таким чином:

Довідка та документація в IPython | 7


в[10]: str.*знайти*? вул
.знайти
вул.rfind

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

Комбінації клавіш в оболонці IPython


Якщо ви проводите певну кількість часу за комп’ютером, ви, ймовірно, знайшли застосування
комбінаціям клавіш у своєму робочому процесі. Можливо, найвідомішими є Cmd-C і Cmd-V (або
Ctrl-C і Ctrl-V) для копіювання та вставлення в різноманітних програмах і системах. Досвідчені
користувачі, як правило, йдуть ще далі: популярні текстові редактори, такі як Emacs, Vim та інші,
надають користувачам неймовірний діапазон операцій за допомогою складних комбінацій
натискань клавіш.

Оболонка IPython не заходить так далеко, але надає низку клавіатурних скорочень для
швидкої навігації під час введення команд. Насправді ці ярлики надає не сам IPython, а
через його залежність від бібліотеки GNU Readline: таким чином, деякі з наступних ярликів
можуть відрізнятися залежно від конфігурації вашої системи. Крім того, хоча деякі з цих
ярликів справді працюють у блокноті на основі браузера, у цьому розділі в основному
йдеться про ярлики в оболонці IPython.

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

Швидкі клавіші навігації

Хоча використання клавіш зі стрілками вліво та вправо для переміщення назад і вперед у рядку є
цілком очевидним, існують інші варіанти, які не вимагають переміщення рук із «домашнього»
положення клавіатури:

натискання клавіші Дія


Ctrl-a Перемістити курсор на початок рядка

Ctrl-e Перемістити курсор у кінець рядка

Ctrl-b (або клавіша зі стрілкою вліво) Ctrl-f Перемістити курсор на один символ назад

(або клавіша зі стрілкою вправо) Перемістити курсор на один символ вперед

8 | Розділ 1: IPython: поза звичайним Python


Комбінації клавіш для введення тексту

Хоча всі знайомі з використанням клавіші Backspace для видалення


попереднього символу, дотягнення до клавіші часто вимагає невеликої
гімнастики пальців, і це видаляє лише один символ за раз. В IPython є кілька
ярликів для видалення частини тексту, який ви вводите. Найбільш корисними з
них є команди видалення цілих рядків тексту. Ви зрозумієте, що вони стали
другою натурою, якщо використаєте комбінацію Ctrl-b і Ctrl-d замість того, щоб
натиснути клавішу Backspace, щоб видалити попередній символ!

натискання клавіші Дія


Клавіша повернення Видалити попередній символ у рядку Видалити наступний

Ctrl-d символ у рядку Вирізати текст від курсору до кінця рядка

Ctrl-k Вирізати текст від початку рядка до курсору Вирізати

Ctrl-u (тобто вставити) текст, який раніше було вирізано

Ctrl-y Транспонувати (тобто переключити) попередні два

Ctrl-t символи

Ярлики історії команд


Можливо, найефективніші ярлики, які тут обговорюються, це ті, які надає IPython для
навігації в історії команд. Ця історія команд виходить за межі вашого поточного сеансу
IPython: уся ваша історія команд зберігається в базі даних SQLite у каталозі вашого
профілю IPython. Найпростіший спосіб отримати доступ до них — це натискати клавіші зі
стрілками вгору та вниз, щоб переходити по історії, але існують і інші варіанти:

натискання клавіші Дія


Ctrl-p (або клавіша зі стрілкою вгору) Доступ до попередньої команди в історії

Ctrl-n (або клавіша зі стрілкою вниз) Доступ до наступної команди в історії

Ctrl-r Зворотний пошук в історії команд

Зворотний пошук може бути особливо корисним. Нагадаємо, що в попередньому розділі ми


визначили функцію під назвоюМайдан.Давайте здійснимо зворотний пошук нашої історії Python
з нової оболонки IPython і знову знайдемо це визначення. Коли ви натискаєте Ctrl-r у терміналі
IPython, ви побачите таке повідомлення:

в[1]:
(зворотний-i-пошук)`':

Якщо ви почнете вводити символи під час цього запиту, IPython автоматично заповнить останню
команду, якщо така є, яка відповідає цим символам:

Комбінації клавіш в оболонці IPython | 9


в[1]:
(зворотний-i-пошук)`кв': Майдан??

У будь-який момент ви можете додати більше символів, щоб уточнити пошук, або знову
натиснути Ctrl-r, щоб шукати далі іншу команду, яка відповідає запиту. Якщо ви дотримувалися
попереднього розділу, натиснувши Ctrl-r ще двічі, ви отримаєте:

в[1]:
(зворотний-i-пошук)`кв': def square(a):
"""Повернути квадрат"""
поверненняa**2

Коли ви знайшли потрібну команду, натисніть Return, і пошук завершиться.


Потім ми можемо використати отриману команду та продовжити наш сеанс:
в[1]:захМайдан(a):
"""Повернути квадрат"""
поверненняa**2

в[2]:Майдан(2)
Вийти[2]:4

Зауважте, що ви також можете використовувати Ctrl-p/Ctrl-n або клавіші зі стрілками


вгору/вниз для пошуку в історії, але лише за символами на початку рядка. Тобто, якщо ви
друкуєтезаха потім натисніть Ctrl-p, буде знайдена остання команда (якщо така є) у вашій
історії, яка починається з символівзах.

Різні ярлики
Нарешті, є кілька різних комбінацій клавіш, які не підходять до жодної з
попередніх категорій, але все ж корисно знати:

Дія
натискання клавіші

Ctrl-l Очистити екран терміналу

Ctrl-c Перервати поточну команду Python.

Ctrl-d Вийти з сеансу IPython

Комбінація клавіш Ctrl-c, зокрема, може бути корисною, коли ви ненавмисно починаєте дуже
тривалу роботу.

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

Чарівні команди IPython


Попередні два розділи показали, як IPython дозволяє ефективно та інтерактивно
використовувати та досліджувати Python. Тут ми почнемо обговорення деяких покращень, які

10 | Розділ 1: IPython: поза звичайним Python


IPython додає до звичайного синтаксису Python. Вони відомі в IPython як магічні
командиі починаються символом %. Ці чарівні команди призначені для стислого
вирішення різноманітних типових проблем стандартного аналізу даних. Чарівні
команди бувають двох видів:лінія магії, які позначаються одним префіксом % і
працюють в одному рядку введення, іклітинні магії, які позначаються подвійним
префіксом %% і діють на кількох рядках введення. Тут ми продемонструємо та
обговоримо кілька коротких прикладів, а далі в розділі повернемося до детальнішого
обговорення кількох корисних магічних команд.

Вставлення блоків коду: %paste та %cpaste

Коли ви працюєте в інтерпретаторі IPython, одна поширена помилка полягає в тому, що


вставлення блоків багаторядкового коду може призвести до неочікуваних помилок, особливо
коли задіяні відступи та маркери інтерпретатора. Поширеним випадком є те, що ви знаходите
приклад коду на веб-сайті та хочете вставити його у свій інтерпретатор. Розглянемо наступну
просту функцію:

> > > захнічого не робити(x):


... поверненняx

Код відформатовано так, як він виглядав би в інтерпретаторі Python, і якщо ви скопіюєте та вставите
його безпосередньо в IPython, ви отримаєте помилку:

в[2]:>>>захнічого не робити(x):
...: ... поверненняx

...:
Файл"<ipython-input-20-5a66c8964687>",лінія2
... поверненняx

^
Синтаксична помилка:недійсний синтаксис

У прямій вставці інтерпретатор бентежить додаткові символи підказки. Але ніколи не


бійтеся — IPython %пастаФункція magic призначена для обробки саме цього типу
багаторядкового розміченого введення:

в[3]:%паста
> > > захнічого не робити(x):
... поверненняx

# # - - Кінець вставленого тексту --

%пастаКоманда одночасно вводить і виконує код, тому тепер функція готова до


використання:

в[4]:нічого не робити(10)
Вийти[4]:10

Команда з подібним наміром %cpaste,який відкриває інтерактивну багаторядкову підказку, у яку


ви можете вставити один або кілька фрагментів коду, який буде виконано в пакеті:

Чарівні команди IPython | 11


в[5]:%cpaste
Вставлення коду;введіть'--'один на лінії, щоб зупинитисяабовикористовувати Ctrl-Д. :
>>>захнічого не робити(x): :...
поверненняx

:--
Ці чарівні команди, як і інші, які ми побачимо, роблять доступними функції, які були б складними
або неможливими у стандартному інтерпретаторі Python.

Виконується зовнішній код: %run

Коли ви починаєте розробляти ширший код, ви, швидше за все, помітите, що працюєте як в IPython
для інтерактивного дослідження, так і в текстовому редакторі для зберігання коду, який ви хочете
використовувати повторно. Замість того, щоб запускати цей код у новому вікні, може бути зручно
запустити його під час сеансу IPython. Це можна зробити за допомогою %бігтимагія.

Наприклад, уявіть, що ви створили amyscript.pyфайл із таким вмістом:


#-------------------------------------
# файл: myscript.py

захМайдан(x):
"""звести число в квадрат"""
поверненняx**2

дляНвдіапазон(1,4):
друкувати(Н,"в квадраті є",Майдан(Н))

Ви можете виконати це зі свого сеансу IPython наступним чином:

в[6]:%бігтиmyscript.py 1у
квадратіє1
2у квадратіє4
3у квадратіє9

Зауважте також, що після запуску цього сценарію будь-які функції, визначені в ньому, доступні для
використання у вашому сеансі IPython:

в[7]:Майдан(5)
Вийти[7]:25

Є кілька варіантів для точного налаштування того, як виконується ваш код; ви можете переглянути
документацію звичайним способом, набравши%бігти?в інтерпретаторі IPython.

Час виконання коду: %timeit


Іншим прикладом корисної магічної функції є %timeit,який автоматично визначить
час виконання однорядкового оператора Python, який слідує за ним. Наприклад, ми
можемо захотіти перевірити ефективність розуміння списку:

в[8]:%timeitL = [n ** 2 для n у діапазоні (1000)] 1000


петлі,кращі3:325µs на петлю

12 | Розділ 1: IPython: поза звичайним Python

www.allitebooks.com
Вигода %timeitполягає в тому, що для коротких команд він автоматично виконає кілька
запусків, щоб отримати надійніші результати. Для багаторядкових операторів додавання
другого знака % перетворить це на чарівну комірку, яка може обробляти кілька рядків
введення. Наприклад, ось еквівалентна конструкція з aдляпетля:

в[9]:%%timeit
. . . : L = []
. . . : для n у діапазоні (1000):
...: L.append(n ** 2)
...:
1000 циклів, найкраще з 3: 373 мкс на цикл

Ми відразу бачимо, що розуміння списку приблизно на 10% швидше, ніж еквівалентдля


побудова циклу в цьому випадку. Ми вивчимо %timeitта інші підходи до синхронізації та
профілювання коду в«Код профілювання та синхронізації» на сторінці 25.

Довідка щодо магічних функцій: ?, %magic і %lsmagic

Як і звичайні функції Python, чарівні функції IPython мають рядки документації, і до цієї
корисної документації можна отримати доступ у стандартний спосіб. Так, наприклад, щоб
прочитати документацію %timeitmagic, просто введіть це:

в[10]: %timeit?

Так само можна отримати доступ до документації для інших функцій. Щоб отримати доступ до
загального опису доступних магічних функцій, включаючи деякі приклади, ви можете ввести це:

в[11]:%магія

Щоб отримати швидкий і простий список усіх доступних магічних функцій, введіть це:

в[12]:%lsmagic

Насамкінець зазначу, що за бажанням можна легко визначити власні магічні функції. Ми


не будемо обговорювати це тут, але якщо вам цікаво, перегляньте посилання, наведені в
«Додаткові ресурси IPython» на сторінці 30.

Історія введення та виведення

Раніше ми бачили, що оболонка IPython дозволяє отримати доступ до попередніх


команд за допомогою клавіш зі стрілками вгору та вниз або, еквівалентно,
комбінацій клавіш Ctrl-p/Ctrl-n. Крім того, як в оболонці, так і в блокноті, IPython
надає кілька способів отримати вихідні дані попередніх команд, а також рядкові
версії самих команд. Ми розглянемо їх тут.

Вхідні та вихідні об’єкти IPython

Я вважаю, що ви вже добре знайомі зВхід[1]:/Вихід[1]:стильові підказки, які використовуються


IPython. Але виявляється, це не просто красива прикраса: вони дають підказку

Історія введення та виведення | 13


щодо того, як ви можете отримати доступ до попередніх входів і виходів у поточному сеансі. Уявіть, що
ви починаєте сеанс, який виглядає так:

в[1]:імпортматематика

в[2]:математика.гріх(2) Вийти[2]:
0,9092974268256817

в[3]:математика.cos(2) Вийти[3]:-
0,4161468365471424

Ми імпортували вбудованийматематикапакет, а потім обчислив синус і косинус числа 2. Ці


вхідні та вихідні дані відображаються в оболонці за допомогоюIn outмітки, але є ще більше
— IPython фактично створює деякі змінні Python, які називаютьсявіВийти
які автоматично оновлюються, щоб відобразити цю історію:

в[4]:друкувати(в)
['',"імпорт математики",'math.sin(2)','math.cos(2)','print(In)']

в[5]:Вийти
Вийти[5]: {2:0,9092974268256817,3:-0,4161468365471424}

Theвоб’єкт – це список, у якому відстежуються команди в порядку (перший елемент у


списку – це заповнювач, щобв[1]можна посилатися на першу команду):

в[6]:друкувати(в[1]) імпорт
математика

TheВийтиоб’єкт — це не список, а словник, що відображає вхідні числа на їхні виходи (якщо такі
є):

в[7]:друкувати(Вийти[2])
0,9092974268256817

Зауважте, що не всі операції мають результати: наприклад,імпортзаяви тадрукувати


оператори не впливають на результат. Останнє може бути дивним, але має сенс, якщо
врахувати цедрукуватице функція, яка повертаєнемає;для стислості будь-яка команда, яка
повертаєЖодногоне додається доВийти

Це може бути корисно, якщо ви хочете взаємодіяти з минулими результатами. Наприклад,


давайте перевіримо сумуsin(2) ** 2іcos(2) ** 2використовуючи попередньо обчислені
результати:

в[8]:Вийти[2]**2+Вийти[3]**2
Вийти[8]:1.0

Результат є1.0як ми очікуємо від добре відомої тригонометричної тотожності. У цьому випадку
використання цих попередніх результатів, ймовірно, не є необхідним, але це може стати дуже зручним,
якщо ви виконуєте дуже дорогі обчислення та хочете повторно використати результат!

14 | Розділ 1: IPython: поза звичайним Python


Ярлики підкреслення та попередні виходи
Стандартна оболонка Python містить лише один простий ярлик для доступу до
попереднього виведення; змінна _ (тобто одне підкреслення) оновлюється з попереднім
результатом; це також працює в IPython:

в[9]:друкувати(_)
1.0
Але IPython йде далі — ви можете використовувати подвійне підкреслення для доступу до
передостаннього виводу та потрійне підкреслення для доступу до передостаннього виведення
(пропускаючи будь-які команди без виведення):

в[10]:друкувати(__)
- 0,4161468365471424

в[11]:друкувати(___)
0,9092974268256817

На цьому IPython зупиняється: більше трьох символів підкреслення стає дещо важко
порахувати, і на цьому етапі легше посилатися на вихід за номером рядка.

Є ще один ярлик, про який ми повинні згадати, це скорочення дляВийшов[X]є


_X (тобто одне підкреслення, за яким іде номер рядка):

в[12]:Вийти[2]
Вийти[12]:0,9092974268256817

в[13]:_2
Вийти[13]:0,9092974268256817

Придушення виводу

Іноді вам може знадобитися придушити вивід інструкції (це, мабуть, найпоширеніше
з командами побудови, які ми досліджуватимемо вРозділ 4). Або, можливо, команда,
яку ви виконуєте, створює результат, який ви б не хотіли зберігати в історії виводу,
можливо, щоб його можна було звільнити, коли інші посилання буде видалено.
Найпростіший спосіб придушити вихід команди – додати крапку з комою в кінці
рядка:

в[14]:математика.гріх(2)+математика.cos(2);

Зауважте, що результат обчислюється мовчки, а результат не відображається на екрані та


не зберігається вВийтисловник:

в[15]:14вOut Out[15
]:помилковий

Історія введення та виведення | 15


Пов’язані магічні команди

Для одночасного доступу до групи попередніх введених даних %історіїчарівна команда дуже
допомагає. Ось як ви можете надрукувати перші чотири введення:

в[16]:%історії-п. 1-4
1:імпортматематика

2:математика.гріх(2)
3:математика.cos(2)
4:друкувати(в)

Як зазвичай, ви можете ввести %історія?для отримання додаткової інформації та опису


доступних опцій. Інші подібні магічні команди %повтор (який повторно виконає деяку частину
історії команд) і %зберегти (який зберігає певний набір історії команд у файл). Для отримання
додаткової інформації я пропоную вивчити їх за допомогою ? функціональні можливості довідки,
про які йдеться в«Довідка та документація в IPython» на сторінці 3.

Команди IPython і Shell


Під час інтерактивної роботи зі стандартним інтерпретатором Python одним із розчарувань, з
якими ви зіткнетеся, є необхідність перемикатися між кількома вікнами для доступу до
інструментів Python та системних інструментів командного рядка. IPython заповнює цю
прогалину та дає вам синтаксис для виконання команд оболонки безпосередньо з терміналу
IPython. Чарівність відбувається із знаком оклику: усе, що з’являється після ! у рядку
виконуватиметься не ядром Python, а системним командним рядком.

Далі припускається, що ви користуєтеся Unix-подібною системою, як-от Linux або Mac OS X. Деякі
з наведених нижче прикладів не працюватимуть у Windows, яка за замовчуванням використовує
інший тип оболонки (хоча у 2016 році було анонсовано рідний Bash оболонок у Windows,
незабаром це може більше не бути проблемою!). Якщо ви не знайомі з командами оболонки, я
пропоную переглянутиПідручник з оболонкизібрані незмінно відмінною організацією Software
Carpentry Foundation.

Короткий вступ до оболонки


Повний вступ до використання оболонки/терміналу/командного рядка виходить за рамки цього
розділу, але для непосвячених ми запропонуємо короткий вступ тут. Оболонка — це спосіб
текстової взаємодії з комп’ютером. Починаючи з середини 1980-х років, коли Microsoft і Apple
представили перші версії своїх тепер уже повсюдних графічних операційних систем, більшість
користувачів комп’ютерів взаємодіяли зі своєю операційною системою за допомогою знайомих
клацань меню та рухів перетягування. Але операційні системи існували задовго до цих
графічних інтерфейсів користувача, і вони в основному керувалися за допомогою послідовності
введення тексту: у підказці користувач вводив команду, а комп’ютер виконував те, що йому
казав користувач. Ті ранні підказки

16 | Розділ 1: IPython: поза звичайним Python


системи є попередниками оболонок і терміналів, які більшість активних дослідників обробки даних
використовують і сьогодні.

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

Як приклад, ось зразок сеансу оболонки Linux/OS X, де користувач


досліджує, створює та змінює каталоги та файли у своїй системі (osx:~ $є
підказкою, а все після знака $ є введеною командою; текст, якому
передує #, має на увазі лише опис, а не те, що ви насправді вводите):
osx:~$луна"Привіт Світ" # echo схоже на функцію друку Python
Привіт Світ

osx:~$pwd # pwd = надрукувати робочий каталог


/ додому / Джейк # це "шлях", на якому ми знаходимося

osx:~$ls # ls = список вмісту робочого каталогу


зошити проекти

osx:~$компакт-дискпроекти/ # cd = змінити каталог

osx:проекти$pwd
/home/jake/projects

osx:проекти$ls
datasci_book mpld3 myproject.txt

osx:проекти$mkdir myproject # mkdir = створити новий каталог

osx:проекти$компакт-дискмій проект/

osx:мій проект$mv ../myproject.txt ./ # mv = перемістити файл. Ось ми рухаємося


# файл myproject.txt з одного каталогу
# вгору (../) до поточного каталогу (./)
osx:мій проект$ls
myproject.txt

Зауважте, що все це лише компактний спосіб виконання звичних операцій (навігація


структурою каталогу, створення каталогу, переміщення файлу тощо) шляхом введення
команд, а не натискання піктограм і меню. Зауважте, що за допомогою лише кількох
команд (pwd, ls, cd, mkdir,іcp)ви можете виконувати багато найпоширеніших операцій з
файлами. Коли ви виходите за рамки цих основ, підхід оболонки стає справді потужним.

IPython і команди оболонки | 17


Команди оболонки в IPython

Ви можете використовувати будь-яку команду, яка працює в командному рядку IPython,


додавши до неї префікс ! характер. Наприклад,ls, pwd,ілунакоманди можна виконувати
наступним чином:

в[1]:!ls
мій проект.txt

в[2]:!pwd
/додому/Джейк/проекти/мій проект

в[3]:!луна"друк з оболонки" друквід


оболонка

Передача значень до та з оболонки


Команди оболонки можна не тільки викликати з IPython, але також можна змусити їх
взаємодіяти з простором імен IPython. Наприклад, ви можете зберегти результат будь-якої
команди оболонки до списку Python за допомогою оператора присвоєння:

в[4]:вміст= !ls

в[5]:друкувати(вміст) [
'myproject.txt']

в[6]:каталог= !pwd

в[7]:друкувати(каталог)
['/Users/jakevdp/notebooks/tmp/myproject']

Зауважте, що ці результати повертаються не як списки, а як спеціальний тип повернення оболонки,


визначений у IPython:

в[8]:типу(каталог) IPython.
утиліти.текст.SList

Це виглядає та діє дуже схоже на список Python, але має додаткові функції, такі якgrepіполя
методи таs, n,історвластивості, які дозволяють шукати, фільтрувати та відображати результати
зручними способами. Для отримання додаткової інформації про них ви можете скористатися
вбудованими функціями довідки IPython.

Зв’язок в іншому напрямку — передача змінних Python в оболонку —


можливий через {змінна}синтаксис:
в[9]:повідомлення="привіт від Python"

в[10]:!луна{повідомлення}
привітвідPython

18 | Розділ 1: IPython: поза звичайним Python


Фігурні дужки містять назву змінної, яка замінюється вмістом змінної в
команді оболонки.

Магічні команди, пов’язані з оболонкою

Якщо ви деякий час пограєте з командами оболонки IPython, ви можете помітити, що ви не можете використовувати !

компакт-дискдля навігації файловою системою:

в[11]:!pwd
/додому/Джейк/проекти/мій проект

в[12]:!компакт-диск..

в[13]:!pwd
/додому/Джейк/проекти/мій проект

Причина в тому, що команди оболонки в блокноті виконуються у тимчасовій підоболонці. Якщо


ви бажаєте змінити робочий каталог на більш стійкий спосіб, ви можете скористатися %компакт-
дискчарівна команда:

в[14]:%компакт-диск.. /
додому/Джейк/проекти

Фактично, за замовчуванням ви навіть можете використовувати це без знака %:

в[15]:cd myproject
/додому/Джейк/проекти/мій проект

Це відомо як anавтомагіяі цю поведінку можна перемикати за допомогою


%автомагічниймагічна функція.

крім %cd,інші доступні магічні функції, подібні до оболонки, становлять %cat, %cp, %env, %ls, %man,
%mkdir, %more, %mv, %pwd, %rm,і %rmdir,будь-який з яких можна використовувати без знака %,
якщоавтомагіяувімкнено. Це робить так, що ви можете сприймати підказку IPython так, ніби це
звичайна оболонка:

в[16]:mkdir tmp

в[17]:ls
мій проект.txt tmp/

в[18]:cp myproject.txt tmp/

в[19]:ls tmp
myproject.txt

в[20]:пд-r tmp

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

Магічні команди, пов’язані з оболонкою | 19


Помилки та налагодження

Розробка коду та аналіз даних завжди вимагають спроб і помилок, і IPython містить
інструменти для оптимізації цього процесу. У цьому розділі коротко описано деякі
параметри керування звітами про винятки Python, а потім досліджено інструменти для
налагодження помилок у коді.

Керування винятками: %xmode


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

в[1]:захфункція1(a,b):
поверненняa/b

захфункція2(x):
a=x
b=x-1
поверненняфункція1(a,b)

в[2]:функція2(1)

--------------------------------------------------------------------------
ZeroDivisionError Traceback (останній виклик останній)

<ipython-input-2-b2e110f6fc8f^gt; в <module>()
- - - - > 1 функція2(1)

<ipython-input-1-d849e34d61fb> у func2(x)
5 a=x
6 b=x-1
---->7 повернути func1(a, b)

<ipython-input-1-d849e34d61fb> у func1(a, b)
1 def func1(a, b):
---->2 повернення a / b
3
4 def func2(x):
5а=х

ZeroDivisionError: ділення на нуль

Дзвінокфункція2призводить до помилки, і читання надрукованого сліду дозволяє нам побачити, що


саме сталося. За замовчуванням це трасування включає кілька рядків, що показують контекст кожного

20 | Розділ 1: IPython: поза звичайним Python


крок, який призвів до помилки. Використовуючи %xmodeмагічна функція (скорочення відрежим винятку), ми
можемо змінити інформацію, яка друкується.

%xmodeприймає один аргумент, режим, і є три можливості:Простий, контекст,і


Багатослівний.За замовчуваннямконтекст,і дає такий результат, як щойно показаний.
Рівнинає більш компактним і дає менше інформації:

в[3]:%xmode Plain

Режим звітування про винятки: простий

в[4]:функція2(1)

-----------------------------------------------------------
Відстеження (останній останній виклик):

Файл "<ipython-input-4-b2e110f6fc8f>", рядок 1, у <module>


функція2(1)

Файл "<ipython-input-1-d849e34d61fb>", рядок 7, у func2


повернути func1(a, b)

Файл "<ipython-input-1-d849e34d61fb>", рядок 2, у func1


повернення a / b

ZeroDivisionError: ділення на нуль

TheБагатослівнийрежим додає деяку додаткову інформацію, включаючи аргументи для будь-яких


функцій, які викликаються:

в[5]:%xmode Verbose

Режим звітування про винятки: докладний

в[6]:функція2(1)

--------------------------------------------------------------------------
ZeroDivisionError Traceback (останній виклик останній)

<ipython-input-6-b2e110f6fc8f> у <module>()
- - - - > 1 функція2(1)
global func2 = <функція func2 за адресою 0x103729320>

<ipython-input-1-d849e34d61fb> у func2(x=1)
5 a=x
6 b=x-1
---->7 повернути func1(a, b)
глобальна функція1 = <функція функція1 за адресою
0x1037294d0> a = 1
b=0

Помилки та налагодження | 21
<ipython-input-1-d849e34d61fb> у func1(a=1, b=0)
1 def func1(a, b):
- - - - > 2 повертає a / ba =
1
b=0
3
4 def func2(x):
5а=х

ZeroDivisionError: ділення на нуль

Ця додаткова інформація може допомогти вам звузити розуміння причини виникнення винятку.
Тож чому б не використатиБагатослівнийрежим весь час? Оскільки код стає складнішим, такий
тип відстеження може стати надзвичайно довгим. Залежно від контексту, іноді від стислості
За замовчуваннямз режимом легше працювати.

Налагодження: коли недостатньо читати зворотні відстеження

Стандартним інструментом Python для інтерактивного налагодження єpdb,налагоджувач


Python. Цей налагоджувач дозволяє користувачеві проглядати код рядок за рядком, щоб
побачити, що може викликати складнішу помилку. Розширена версія IPythonipdb,
налагоджувач IPython.

Існує багато способів запуску та використання обох цих налагоджувачів; ми не будемо розглядати їх
повністю тут. Зверніться до онлайн-документації цих двох утиліт, щоб дізнатися більше.

В IPython, можливо, найзручнішим інтерфейсом для налагодження є %відлагоджувати


чарівна команда. Якщо ви викличете його після того, як виникне виняток, він
автоматично відкриє інтерактивну підказку налагодження в точці винятку. Theipdbпідказка
дозволяє досліджувати поточний стан стека, досліджувати доступні змінні та навіть
запускати команди Python!

Давайте розглянемо останній виняток, а потім виконаємо кілька основних завдань — надрукуємо значення

aіb,і типкинутищоб вийти з сеансу налагодження:

в[7]:%відлагоджувати

> <ipython-input-1-d849e34d61fb>(2)func1() 1
def func1(a, b):
---->2 повернення a / b
3

ipdb> print(a)
1
ipdb> print(b)
0
ipdb> вийти

22 | Розділ 1: IPython: поза звичайним Python


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

в[8]:%відлагоджувати

> <ipython-input-1-d849e34d61fb>(2)func1() 1
def func1(a, b):
---->2 повернення a / b
3

ipdb> вгору
> <ipython-input-1-d849e34d61fb>(7)func2() 5
a=x
6 b=x-1
---->7 повернути func1(a, b)

ipdb> print(x)
1
ipdb> вгору
> <ipython-input-6-b2e110f6fc8f>(1)<module>()
- - - - > 1 функція2(1)

ipdb> вниз
> <ipython-input-1-d849e34d61fb>(7)func2() 5
a=x
6 b=x-1
---->7 повернути func1(a, b)

ipdb> вийти

Це дозволяє швидко з’ясувати не лише причину помилки, а й виклики яких


функцій призвели до помилки.

Якщо ви бажаєте, щоб налагоджувач запускався автоматично щоразу, коли виникає виняткова ситуація, ви

можете використовувати %pdbмагічна функція для ввімкнення цієї автоматичної поведінки:

в[9]:%xmode Plain
%pdb на
функція2(1)

Режим звітування про винятки: звичайний


автоматичний виклик pdb увімкнено

Traceback (останній останній виклик):

Файл "<ipython-input-9-569a67d2d312>", рядок 3, у <module>


функція2(1)

Файл "<ipython-input-1-d849e34d61fb>", рядок 7, у func2


повернути func1(a, b)

Помилки та налагодження | 23
Файл "<ipython-input-1-d849e34d61fb>", рядок 2, у func1
повернення a / b

ZeroDivisionError: ділення на нуль

> <ipython-input-1-d849e34d61fb>(2)func1() 1
def func1(a, b):
---->2 повернення a / b
3

ipdb> print(b)
0
ipdb> вийти

Нарешті, якщо у вас є сценарій, який ви хочете запустити з самого початку в інтерактивному режимі, ви
можете запустити його за допомогою команди %запустити -d,і використовуйтенаступнийкоманда для
інтерактивного переходу по рядках коду.

Неповний список команд налагодження

Існує набагато більше доступних команд для інтерактивного налагодження, ніж ми


перерахували тут; наступна таблиця містить опис деяких найбільш поширених і корисних
з них:

Команда опис
список Показати поточне розташування у файлі

h(допомога) Показати список команд або знайти довідку щодо певної команди.

q(вихід) Вийти з налагоджувача та програми

c(продовжувати) Вийти з налагоджувача; продовжити в програмі

n(ext) Перейти до наступного кроку програми

<ввести> Повторіть попередню команду

p(друк) Друк змінних

s (крок) Перейти до підпрограми

r (повернення) Повернутися з підпрограми

Для отримання додаткової інформації використовуйтедопомогтиу налагоджувачі або перегляньте


ipdb'сонлайн документація.

24 | Розділ 1: IPython: поза звичайним Python


Код профілювання та синхронізації

У процесі розробки коду та створення конвеєрів обробки даних часто існують


компроміси між різними реалізаціями. На ранніх етапах розробки алгоритму
турбуватися про такі речі може бути контрпродуктивним. Як іронізував Дональд Кнут:
«Ми повинні забути про малу ефективність, скажімо, приблизно в 97% випадків:
передчасна оптимізація — це корінь усього зла».

Але як тільки ваш код запрацює, буде корисно трохи покопатися в його ефективності.
Іноді корисно перевірити час виконання певної команди або набору команд; іноді
корисно заглибитися в багаторядковий процес і визначити, де є вузьке місце в
складній серії операцій. IPython надає доступ до широкого спектру функціональних
можливостей для такого типу синхронізації та профілювання коду. Тут ми
обговоримо такі магічні команди IPython:

% часу
Час виконання окремого оператора

%timeit
Час повторного виконання одного оператора для більшої точності

% обрізати

Запустіть код за допомогою профайлера

%lprun
Запустіть код за допомогою построкового профайлера

%memit
Виміряйте використання пам’яті одним оператором

%mprun
Запустіть код із построковим профайлером пам’яті

Останні чотири команди не входять до складу IPython — вам потрібно буде інсталювати
line_profilerіmemory_profilerрозширення, які ми обговоримо в наступних
розділах.

Фрагменти коду синхронізації: %timeit і %time

Ми бачили %timeitмагія лінії та %%timeitклітинна магія у вступі до магічних функцій в


«Чарівні команди IPython» на сторінці 10; %%timeitможна використовувати для визначення
часу повторного виконання фрагментів коду:

в[1]:%timeitсума(діапазон(100))

100000 циклів, найкраще з 3: 1,54 мкс на цикл

Код профілювання та синхронізації | 25


Зауважте, що оскільки ця операція дуже швидка, %timeitавтоматично виконує велику
кількість повторень. Для повільніших команд, %timeitавтоматично налаштує та виконає
менше повторень:

в[2]:%%timeit
всього=0
дляiвдіапазон(1000):
дляjвдіапазон(1000):
всього+=i*(-1)**j

1 цикл, найкраще з 3: 407 мс на цикл

Іноді повторна операція – не найкращий варіант. Наприклад, якщо у нас є список, який ми хотіли б
відсортувати, нас може ввести в оману повторна операція. Сортування попередньо відсортованого списку
відбувається набагато швидше, ніж сортування невідсортованого списку, тому повторення спотворить
результат:

в[3]:імпортвипадковий
Л=[випадковий.випадковий()дляiвдіапазон(100000)] %
timeit Л.сортувати()

100 циклів, найкраще з 3: 1,9 мс на цикл

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

в[4]:імпортвипадковий
Л=[випадковий.випадковий()дляiвдіапазон(100000)]
друкувати("сортування несортованого списку:") %час Л.
сортувати()

сортування несортованого списку:


Час ЦП: користувач 40,6 мс, система: 896 мкс, загальна: 41,5 мс
Час стіни: 41,5 мс

в[5]:друкувати("сортування вже відсортованого списку:")


%час Л.сортувати()

сортування вже відсортованого списку:


Час ЦП: користувач 8,18 мс, система: 10 мкс, загальна: 8,19 мс
Час стіни: 8,24 мс

Зверніть увагу, наскільки швидше сортується попередньо відсортований список, але також зверніть
увагу, скільки часу займає час із %часпроти %timeit,навіть для попередньо відсортованого списку! Це
результат того факту, що %timeitробить деякі розумні речі під капотом, щоб запобігти втручанню
системних викликів у синхронізацію. Наприклад, він запобігає очищенню невикористаних об’єктів
Python (відомих якзбір сміття), які інакше можуть вплинути на час. З цієї причини, %timeitрезультати
зазвичай помітно швидше ніж %часрезультати.

Для %часЯк і в випадку %timeit,використання магічного синтаксису клітинки з подвійним знаком відсотка дозволяє

синхронізувати багаторядкові сценарії:

26 | Розділ 1: IPython: поза звичайним Python


в[6]:%%час
всього=0
дляiвдіапазон(1000):
дляjвдіапазон(1000):
всього+=i*(-1)**j

Час ЦП: користувач 504 мс, система: 979 мкс, загальна: 505 мс
Час стіни: 505 мс

Для отримання додаткової інформації про %часі %timeit,а також їхні доступні параметри,
скористайтеся довідкою IPython (тобто введіть%час?у підказці IPython).

Повні сценарії профілювання: %prun

Програма складається з багатьох окремих висловлювань, і іноді визначення часу цих


висловлювань у контексті важливіше, ніж визначення часу їх самих по собі. Python містить
вбудований профайлер коду (про який ви можете прочитати в документації Python), але IPython
пропонує набагато зручніший спосіб використання цього профайлера у вигляді магічної функції
%обрізати.

Для прикладу ми визначимо просту функцію, яка виконує деякі обчислення:

в[7]:захсума_списків(Н):
всього=0
дляiвдіапазон(5):
Л=[j^(j>>i)дляjвдіапазон(Н)] всього+=
сума(Л) поверненнявсього

Тепер ми можемо викликати %обрізатиза допомогою виклику функції, щоб побачити профільовані результати:

в[8]:%обрізати суму_списків(1000000)

У блокноті вихідні дані друкуються на пейджер і виглядають приблизно так:

14 викликів функцій за 0,714 секунди

Впорядковано: внутрішній час

ncalls tottime percall cumtime percall filename:lineno(function)


5 0,599 0,120 0,599 0,120 <ipython-input-19>:4(<listcomp>)
5 0,064 0,013 0,064 0,013 {сума вбудованого методу}
1 0,036 0,036 0,699 0,699 <ipython-input-19>:1(sum_of_lists)
1 0,014 0,014 0,714 0,714 <рядок>:1(<модуль>)
1 0.000 0.000 0.714 0.714 {вбудований метод exec}

Результатом є таблиця, яка вказує, у порядку загального часу на кожен виклик функції, де
виконання витрачає найбільше часу. У цьому випадку основна частина часу виконання
припадає на розуміння списку всерединісума_списків.З цього моменту ми можемо почати
думати про те, які зміни ми можемо внести, щоб покращити продуктивність алгоритму.

Код профілювання та синхронізації | 27


Для отримання додаткової інформації про %обрізка,а також доступні параметри, скористайтеся
довідкою IPython (тобто введіть%обрізати?у підказці IPython).

Построкове профілювання за допомогою %lprun

Профілювання % за функціямиобрізатикорисно, але інколи зручніше мати


построковий звіт профілю. Це не вбудовано в Python або IPython, але єline_profiler
доступний для встановлення пакет, який може це зробити. Почніть із використання
інструменту пакування Python,піп,щоб встановитиline_profilerпакет:

$ pip встановити line_profiler

Далі ви можете використовувати IPython для завантаженняline_profilerРозширення IPython, яке пропонується як


частина цього пакета:

в[9]:%load_ext line_profiler

Тепер %lprunКоманда виконає построкове профілювання будь-якої функції — у цьому випадку


нам потрібно явно вказати, які саме функції ми зацікавлені в профілюванні:

в[10]:%lprun-f сума_списків сума_списків(5000)

Як і раніше, блокнот надсилає результат на пейджер, але виглядає він приблизно так:

Таймер: 1е-06 с

Загальний час: 0,009382 с


Файл: <ipython-input-19-fa2be176cc3e>
Функція: sum_of_lists у рядку 1

рядок # Хіти Час за удар % вмісту шкали часу


==================================================== ============
1 def sum_of_lists(N):
2 1 2 2.0 0,0 загальна сума = 0

3 6 8 1.3 0,1 для i в діапазоні (5):


4 5 9001 1800,2 95.9 L = [j ^ (j >> i) ... загальна
5 5 371 74.2 4.0 сума += сума (L)
6 1 0 0,0 0,0 повернення всього

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

Для отримання додаткової інформації про %lprun,а також доступні параметри, скористайтеся
довідкою IPython (тобто введіть%lprun?у підказці IPython).

28 | Розділ 1: IPython: поза звичайним Python


Використання профілю пам'яті: %memit і %mprun

Іншим аспектом профілювання є обсяг пам’яті, який використовує операція. Це


можна оцінити за допомогою іншого розширення IPython, thememory_profiler.Як і з
line_profiler,ми починаємо зпіп-встановлення розширення:

$ pip встановити memory_profiler

Тоді ми можемо використовувати IPython для завантаження розширення:

в[12]:%load_ext memory_profiler

Розширення профілювача пам'яті містить дві корисні магічні функції: %меміт


магія (що пропонує еквівалент % для вимірювання пам’ятіtimeit)і %mprun
функція (яка пропонує еквівалент % для вимірювання пам’ятіlprun).%мемітФункцію можна
використовувати досить просто:

в[13]:%memit sum_of_lists(1000000)

пікова пам'ять: 100,08 МіБ, приріст: 61,36 МіБ

Ми бачимо, що ця функція використовує близько 100 Мб пам'яті.

Для покрокового опису використання пам’яті ми можемо використовувати %mprunмагія. На


жаль, ця магія працює лише для функцій, визначених в окремих модулях, а не в самому
блокноті, тому ми почнемо з використання %%файлmagic для створення простого модуля під
назвоюmprun_demo.py,який містить нашсума_списківз одним доповненням, яке зробить наші
результати профілювання пам’яті більш зрозумілими:

в[14]:%%файлmprun_demo.py
захсума_списків(Н):
всього=0
дляiвдіапазон(5):
Л=[j^(j>>i)дляjвдіапазон(Н)] всього+=
сума(Л)
делЛ#видалити посилання на Л
поверненнявсього

Перезапис mprun_demo.py

Тепер ми можемо імпортувати нову версію цієї функції та запустити профайлер ліній
пам’яті:

в[15]:відmprun_demoімпортсума_списків
%mprun-f сума_списків сума_списків(1000000)

Результат, надрукований на пейджері, дає нам підсумок використання пам’яті


функцією та виглядає приблизно так:

Код профілювання та синхронізації | 29


Ім'я файлу: ./mprun_demo.py

рядок # Використання Mem Приріст Вміст рядка


==================================================
4 71,9 МіБ 0,0 МіБ L = [j ^ (j >> i) для j в діапазоні (N)]

Ім'я файлу: ./mprun_demo.py

рядок # Використання Mem Приріст Вміст рядка


==================================================
1 39,0 МіБ 0,0 МіБ def sum_of_lists(N):
2 39,0 МіБ 0,0 МіБ загальна сума = 0

3 46,5 МіБ 7,5 МіБ для i в діапазоні (5):


4 71,9 МіБ 25,4 МіБ L = [j ^ (j >> i) для j в діапазоні (N)] загальна
5 71,9 МіБ 0,0 МіБ сума += сума (L)
6 46,5 МіБ - 25,4 МіБ del L # видалити посилання на L
7 39,1 МіБ - 7,4 МіБ повернути підсумок

ОсьПрирістстовпець повідомляє нам, наскільки кожен рядок впливає на загальний бюджет


пам’яті: зверніть увагу на це, коли ми створюємо та видаляємо списокL,ми додаємо близько 25
МБ використання пам’яті. Це на додаток до фонового використання пам’яті самим
інтерпретатором Python.

Для отримання додаткової інформації про %меміті %mprun,а також їхні доступні параметри,
скористайтеся довідкою IPython (тобто введіть%Меміт?у підказці IPython).

Більше ресурсів IPython


У цій главі ми лише пошкрябали поверхню використання IPython для виконання завдань з обробки
даних. Набагато більше інформації доступно як у друкованому вигляді, так і в Інтернеті, і тут ми
перерахуємо деякі інші ресурси, які можуть бути вам корисними.

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

Веб-сайт nbviewer
На цьому сайті показано статичні візуалізації будь-якого блокнота IPython, доступного в Інтернеті. На
головній сторінці представлено приклади блокнотів, які ви можете переглянути, щоб дізнатися, для чого
інші люди використовують IPython!

30 | Розділ 1: IPython: поза звичайним Python


Галерея цікавих блокнотів IPython
Цей постійно зростаючий список блокнотів, створений за допомогою nbviewer, демонструє
глибину та широту числового аналізу, який можна виконати за допомогою IPython. Він
містить усе: від коротких прикладів і посібників до повномасштабних курсів і книг,
складених у форматі блокнота!

Відеоуроки
Шукаючи в Інтернеті, ви знайдете багато відеозаписаних посібників з IPython. Я б
особливо рекомендував шукати навчальні посібники на конференціях PyCon, SciPy та
PyData від Фернандо Переса та Браяна Грейнджера, двох основних творців і
супроводжувачів IPython і Jupyter.

Книги

Python для аналізу даних


У книзі Веса МакКінні є розділ, у якому розповідається про використання IPython як
дослідника даних. Хоча велика частина матеріалу збігається з тим, що ми тут
обговорювали, інша точка зору завжди корисна.

Вивчення IPython для інтерактивних обчислень і візуалізації даних


Ця коротка книга від Cyrille Rossant пропонує гарний вступ до використання IPython для
аналізу даних.

Посібник з інтерактивних обчислень і візуалізації IPython


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

Нарешті, нагадування про те, що ви можете знайти допомогу самостійно: функція довідки IPython на
основі ? (обговорюється в«Довідка та документація в IPython» на сторінці 3) може бути дуже корисним,
якщо ви використовуєте його добре та часто. Переглядаючи приклади тут і в інших місцях, ви можете
використовувати їх, щоб ознайомитися з усіма інструментами, які може запропонувати IPython.

Більше ресурсів IPython | 31

You might also like