Professional Documents
Culture Documents
Python - Datascience Original (001-049) .En - Uk
Python - Datascience Original (001-049) .En - Uk
com
на основі
Джейк ВандерПлас
www.allitebooks.com
www.allitebooks.com
Довідник з вивчення даних Python
Основні інструменти для роботи з даними
Джейк ВандерПлас
www.allitebooks.com
Довідник з вивчення даних Python
Джейком Вандерпласом
Опубліковано O'Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472.
Книги O'Reilly можна придбати для освітніх, ділових або рекламних цілей. Для більшості назв також доступні онлайн-
видання (http://oreilly.com/safari). Щоб отримати додаткову інформацію, зверніться до нашого корпоративного/
інституційного відділу продажів: 800-998-9938 абоcorporate@oreilly.com.
Логотип O'Reilly є зареєстрованою торговою маркою O'Reilly Media, Inc.Довідник з вивчення даних Python, зображення
обкладинки та пов’язаний торговий вигляд є торговими марками O’Reilly Media, Inc.
Незважаючи на те, що видавець і автор сумлінно доклали зусиль, щоб забезпечити точність інформації та
інструкцій, що містяться в цьому творі, видавець і автор відмовляються від будь-якої відповідальності за
помилки або упущення, включаючи, без обмежень, відповідальність за збитки, спричинені використанням або
опора на цю роботу. Використовуйте інформацію та інструкції, що містяться в цій роботі, на власний ризик.
Якщо будь-які зразки коду чи інші технології, які містить або описує ця робота, підпадають під дію ліцензій з
відкритим кодом або прав інтелектуальної власності інших осіб, ви несете відповідальність за те, щоб їх
використання вами відповідало таким ліцензіям і/або правам.
978-1-491-91205-8
[LSI]
www.allitebooks.com
Зміст
Передмова. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
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
Зміст | 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
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 Дрю Конвея, вперше опублікованою в його
блозі у вересні 2010 року (див.Малюнок П-1).
xi
Хоча деякі мітки перетину є дещо нахабними, ця діаграма відображає суть того, що, на мою
думку, люди мають на увазі, коли кажуть «наука про дані»: це фундаментально
міждисциплінарнийтема. Наука про дані складається з трьох різних областей, що
перетинаються: навички астатистхто вміє моделювати та узагальнювати набори даних (які
стають все більшими); навички aінформатикхто може розробляти та використовувати
алгоритми для ефективного зберігання, обробки та візуалізації цих даних; і предметна
експертиза— те, що ми можемо вважати «класичним» навчанням предмету — необхідне як для
формулювання правильних запитань, так і для постановки відповідей на них у контексті.
Зважаючи на це, я б заохотив вас розглядати науку про дані не як про нову сферу знань, яку
потрібно вивчати, а як про новий набір навичок, які ви можете застосувати у своїй поточній
сфері знань. Незалежно від того, чи ви звітуєте про результати виборів, прогнозуєте
прибутковість акцій, оптимізуєте кліки онлайн-реклами, ідентифікуєте мікроорганізми на
фотографіях під мікроскопом, шукаєте нові класи астрономічних об’єктів чи працюєте з даними в
будь-якій іншій галузі, ціль цієї книги — дати вам можливість ставте та відповідайте на нові
запитання щодо обраної предметної області.
xii | Передмова
Корисність Python для науки про дані зумовлена насамперед великою та активною
екосистемою пакетів сторонніх розробників: NumPy для обробки однорідних даних на
основі масивів, Pandas для обробки різнорідних і позначених даних, SciPy для звичайних
наукових обчислювальних завдань, Matplotlib для публікації якості візуалізації, IPython для
інтерактивного виконання та спільного використання коду, Scikit-Learn для машинного
навчання та багато інших інструментів, які будуть згадані на наступних сторінках.
NumPy (Розділ 2)
Ця бібліотека надаєndarrayоб’єкт для ефективного зберігання та обробки щільних
масивів даних у Python.
панди (Розділ 3)
Ця бібліотека надаєDataFrameоб’єкт для ефективного зберігання та маніпулювання
даними з мітками/стовпцями в Python.
Matplotlib (Розділ 4)
Ця бібліотека надає можливості для гнучкого діапазону візуалізацій даних у
Python.
Передмова | xiii
Scikit-Learn (Розділ 5)
Ця бібліотека забезпечує ефективні та чисті реалізації Python
найважливіших і визнаних алгоритмів машинного навчання.
Світ PyData, безумовно, набагато більший, ніж ці п’ять пакетів, і зростає щодня.
Маючи це на увазі, я докладаю всіх зусиль, щоб на цих сторінках надати посилання
на інші цікаві зусилля, проекти та пакети, які розширюють межі того, що можна
зробити на Python. Тим не менш, ці п’ять наразі є основоположними для більшої
частини роботи, яка виконується в галузі науки про дані Python, і я очікую, що вони
залишатимуться важливими, навіть якщо екосистема продовжує розвиватися
навколо них.
Якщо ви вважаєте, що використання вами прикладів коду виходить за межі добросовісного використання або дозволу,
Хоча існують різні способи встановлення Python, я б запропонував для використання в науці про
дані дистрибутив Anaconda, який працює однаково незалежно від того, чи використовуєте ви
Windows, Linux або Mac OS X. Дистрибутив Anaconda доступний у двох варіантах:
xiv | Передмова
до пакетів Python, схожих за духом на інструменти apt або yum, з якими користувачі Linux
можуть бути знайомі.
Курсив
Вказує на нові терміни, URL-адреси, адреси електронної пошти, імена файлів і розширення файлів.
Постійна ширина
Використовується для списків програм, а також у абзацах для позначення елементів
програми, таких як імена змінних або функцій, бази даних, типи даних, змінні
середовища, оператори та ключові слова.
Показує команди або інший текст, який повинен буквально вводити користувач.
Сафарі О'Рейлі
Передмова | 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://bit.ly/python-data-sci-handbook.
Щоб прокоментувати чи поставити технічні запитання щодо цієї книги, надішліть електронний лист на адресуbookques‐
tions@oreilly.com.
Для отримання додаткової інформації про наші книги, курси, конференції та новини відвідайте наш веб-сайт за
адресоюhttp://www.oreilly.com.
YouTube:http://www.youtube.com/oreillymedia
xvi | Передмова
РОЗДІЛ 1
Існує багато варіантів середовищ розробки для Python, і мене часто запитують, яке з них я
використовую у власній роботі. Моя відповідь іноді дивує людей: моє улюблене середовище
IPythonплюс текстовий редактор (у моєму випадку Emacs або Atom залежно від мого настрою).
IPython (скорочення відІнтерактивний Python) був започаткований у 2001 році Фернандо
Пересом як розширений інтерпретатор Python і з тих пір переріс у проект, метою якого є
надання, за словами Переса, «інструментів для всього життєвого циклу дослідницького
обчислення». Якщо Python є двигуном нашого завдання з вивчення даних, ви можете думати
про IPython як про інтерактивну панель керування.
1
Оболонка чи блокнот?
Хоча блокнот IPython можна переглядати та редагувати у вікні веб-браузера, він має
підключитися до запущеного процесу Python, щоб виконати код. Щоб розпочати цей
процес (відомий як «ядро»), виконайте таку команду в системній оболонці:
$jupyter блокнот
Ця команда запустить локальний веб-сервер, який буде видимим для вашого браузера. Він
негайно випльовує журнал, який показує, що він робить; цей журнал виглядатиме приблизно
так:
Коли технічно налаштовану людину просять допомогти другові, члену сім’ї чи колезі з
комп’ютерною проблемою, у більшості випадків це не стільки питання знання відповіді,
скільки знання того, як швидко знайти невідому відповідь. У науці про дані це те ж саме:
веб-ресурси з можливістю пошуку, такі як онлайн-документація, ланцюжки списків
розсилки та відповіді Stack Overflow, містять величезну кількість інформації, навіть
(особливо?), якщо це тема, яку ви вже шукали раніше. Щоб бути ефективним практиком
науки про дані, потрібно не стільки запам’ятовувати інструмент чи команду, які ви повинні
використовувати для кожної можливої ситуації, скільки навчитися ефективно знаходити
інформацію, яку ви не знаєте, через веб-пошукову систему чи іншу засоби.
Тут ми обговоримо інструменти IPython для швидкого доступу до цієї інформації, а саме ?
характер для вивчення документації, ?? символів для вивчення вихідного коду та клавішу
Tab для автозавершення.
в[1]:допомогти(довжина)
Допомога по буд-вфункціядовжинаввбудовані модулі:
довжина(...)
довжина(об'єкт)->ціле число
Залежно від вашого перекладача, ця інформація може відображатися як вбудований текст або в
окремому спливаючому вікні.
в[2]: довж?
Тип: вбудована_функція_або_метод
Строкова форма:<побудований-вфункціядовжина>
Простір імен: Вбудований Python
Документація:
довжина(об'єкт)->ціле число
в[3]:Л=[1,2,3] в[4]:
Л.вставка? Тип:
вбудована_функція_або_метод
Строкова форма:<побудований-вметод вставкиоб'єкт спискув0x1024b8ea8>
Документація: Л.вставка(індекс,об'єкт)--вставкаоб'єктперед індексом
Важливо, що це працюватиме навіть для функцій чи інших об’єктів, які ви створюєте самостійно! Тут ми
визначимо невелику функцію за допомогою рядка документації:
в[6]:захМайдан(a):
....: """Повернути квадрат а."""
Зауважте, що для створення рядка документації для нашої функції ми просто розмістили рядковий літерал у першому
рядку. Оскільки рядки документації зазвичай складаються з кількох рядків, за домовленістю ми використовували
в[7]: Майдан?
Тип: функція
Строкова форма:<функція квадрат при0x103713cb0>
Визначення: Майдан(a)
Документація: Поверніть квадрат a.
Цей швидкий доступ до документації через рядки документів є однією з причин, чому вам варто
виробити звичку завжди додавати таку вбудовану документацію до коду, який ви пишете!
Оскільки мову Python дуже легко читати, зазвичай ви можете отримати інший
рівень розуміння, прочитавши вихідний код об’єкта, який вас цікавить. IPython
надає ярлик вихідного коду з подвійним знаком питання (??):
в[8]: Майдан??
Тип: функція
Строкова форма:<функція квадрат при0x103713cb0>
Визначення:Майдан(a) Джерело:
захМайдан(a):
"Повернути квадрат а"
поверненняa**2
Для таких простих функцій, як ця, подвійний знак питання може дати швидке
розуміння деталей під капотом.
в[9]: довж??
Тип: вбудована_функція_або_метод
Строкова форма:<побудований-вфункціядовжина>
Простір імен: Вбудований Python
Документація:
довжина(об'єкт)->ціле число
Щоб звузити список, ви можете ввести перший символ або кілька символів
імені, і клавіша Tab знайде відповідні атрибути та методи:
в[10]:Л.в<TAB>
Л.ясно Л.копія Л.рахувати
в[10]:Л.співробітництво<TAB
> Л.копія Л.рахувати
Якщо є лише один варіант, натискання клавіші Tab завершить рядок за вас.
Наприклад, наступне буде миттєво замінено наL.count:
в[10]:Л.cou<TAB>
в[10]:Л._<TAB> Л.
__додати__ Л.__gt__ Л.__зменшити__
Л.__клас__ Л.__хеш__ Л.__reduce_ex__
Для стислості ми показали лише перші пару рядків результату. Більшість із них є спеціальними
методами Python із подвійним підкресленням (часто званими методами “dunder”).
Завершення табуляції також корисне під час імпорту об’єктів із пакетів. Тут ми використаємо його, щоб
знайти всі можливі імпорти вitertoolsпакет, який починається зспівробітництво:
Подібним чином ви можете використовувати завершення табуляції, щоб побачити, які імпорти доступні у
вашій системі (це змінюватиметься залежно від того, які сценарії та модулі сторонніх виробників доступні для
вашого сеансу Python):
Завершення табуляції корисне, якщо ви знаєте кілька перших символів об’єкта чи атрибута, який
шукаєте, але мало допоможе, якщо ви хочете знайти відповідність символам у середині чи кінці слова.
Для цього випадку використання IPython надає засоби зіставлення символів підстановки для імен за
допомогою символу *.
Наприклад, ми можемо використовувати це, щоб перерахувати кожен об’єкт у просторі імен, який закінчується на
УВАГА:
в[10]: *УВАГА?
BytesWarning RuntimeWarning
DeprecationWarning SyntaxWarning
FutureWarning UnicodeWarning
ImportWarning UserWarning
PendingDeprecationWarning УВАГА
ResourceWarning
Я вважаю, що цей тип гнучкого пошуку за символами узагальнення може бути дуже корисним
для пошуку певної команди, коли я знайомлюся з новим пакетом або знову знайомлюся зі
знайомим.
Оболонка IPython не заходить так далеко, але надає низку клавіатурних скорочень для
швидкої навігації під час введення команд. Насправді ці ярлики надає не сам IPython, а
через його залежність від бібліотеки GNU Readline: таким чином, деякі з наступних ярликів
можуть відрізнятися залежно від конфігурації вашої системи. Крім того, хоча деякі з цих
ярликів справді працюють у блокноті на основі браузера, у цьому розділі в основному
йдеться про ярлики в оболонці IPython.
Коли ви звикнете до них, вони можуть бути дуже корисними для швидкого виконання
певних команд, не пересуваючи руки з «домашнього» положення клавіатури. Якщо ви
користуєтеся Emacs або маєте досвід роботи з оболонками у стилі Linux, наступне буде
дуже знайомим. Ми згрупуємо ці комбінації клавіш за кількома категоріями:ярлики
навігації,ярлики для введення тексту,ярлики історії команд, ірізні ярлики.
Хоча використання клавіш зі стрілками вліво та вправо для переміщення назад і вперед у рядку є
цілком очевидним, існують інші варіанти, які не вимагають переміщення рук із «домашнього»
положення клавіатури:
Ctrl-b (або клавіша зі стрілкою вліво) Ctrl-f Перемістити курсор на один символ назад
Ctrl-t символи
в[1]:
(зворотний-i-пошук)`':
Якщо ви почнете вводити символи під час цього запиту, IPython автоматично заповнить останню
команду, якщо така є, яка відповідає цим символам:
У будь-який момент ви можете додати більше символів, щоб уточнити пошук, або знову
натиснути Ctrl-r, щоб шукати далі іншу команду, яка відповідає запиту. Якщо ви дотримувалися
попереднього розділу, натиснувши Ctrl-r ще двічі, ви отримаєте:
в[1]:
(зворотний-i-пошук)`кв': def square(a):
"""Повернути квадрат"""
поверненняa**2
в[2]:Майдан(2)
Вийти[2]:4
Різні ярлики
Нарешті, є кілька різних комбінацій клавіш, які не підходять до жодної з
попередніх категорій, але все ж корисно знати:
Дія
натискання клавіші
Комбінація клавіш Ctrl-c, зокрема, може бути корисною, коли ви ненавмисно починаєте дуже
тривалу роботу.
Хоча деякі з обговорюваних тут комбінацій клавіш спочатку можуть здатися трохи нудними, з
практикою вони швидко стають автоматичними. Як тільки ви розвинете цю м’язову пам’ять, я
підозрюю, що ви навіть побажаєте, щоб вони були доступні в інших контекстах.
Код відформатовано так, як він виглядав би в інтерпретаторі Python, і якщо ви скопіюєте та вставите
його безпосередньо в IPython, ви отримаєте помилку:
в[2]:>>>захнічого не робити(x):
...: ... поверненняx
...:
Файл"<ipython-input-20-5a66c8964687>",лінія2
... поверненняx
^
Синтаксична помилка:недійсний синтаксис
в[3]:%паста
> > > захнічого не робити(x):
... поверненняx
в[4]:нічого не робити(10)
Вийти[4]:10
:--
Ці чарівні команди, як і інші, які ми побачимо, роблять доступними функції, які були б складними
або неможливими у стандартному інтерпретаторі Python.
Коли ви починаєте розробляти ширший код, ви, швидше за все, помітите, що працюєте як в IPython
для інтерактивного дослідження, так і в текстовому редакторі для зберігання коду, який ви хочете
використовувати повторно. Замість того, щоб запускати цей код у новому вікні, може бути зручно
запустити його під час сеансу IPython. Це можна зробити за допомогою %бігтимагія.
захМайдан(x):
"""звести число в квадрат"""
поверненняx**2
дляНвдіапазон(1,4):
друкувати(Н,"в квадраті є",Майдан(Н))
в[6]:%бігтиmyscript.py 1у
квадратіє1
2у квадратіє4
3у квадратіє9
Зауважте також, що після запуску цього сценарію будь-які функції, визначені в ньому, доступні для
використання у вашому сеансі IPython:
в[7]:Майдан(5)
Вийти[7]:25
Є кілька варіантів для точного налаштування того, як виконується ваш код; ви можете переглянути
документацію звичайним способом, набравши%бігти?в інтерпретаторі IPython.
www.allitebooks.com
Вигода %timeitполягає в тому, що для коротких команд він автоматично виконає кілька
запусків, щоб отримати надійніші результати. Для багаторядкових операторів додавання
другого знака % перетворить це на чарівну комірку, яка може обробляти кілька рядків
введення. Наприклад, ось еквівалентна конструкція з aдляпетля:
в[9]:%%timeit
. . . : L = []
. . . : для n у діапазоні (1000):
...: L.append(n ** 2)
...:
1000 циклів, найкраще з 3: 373 мкс на цикл
Як і звичайні функції Python, чарівні функції IPython мають рядки документації, і до цієї
корисної документації можна отримати доступ у стандартний спосіб. Так, наприклад, щоб
прочитати документацію %timeitmagic, просто введіть це:
в[10]: %timeit?
Так само можна отримати доступ до документації для інших функцій. Щоб отримати доступ до
загального опису доступних магічних функцій, включаючи деякі приклади, ви можете ввести це:
в[11]:%магія
Щоб отримати швидкий і простий список усіх доступних магічних функцій, введіть це:
в[12]:%lsmagic
в[1]:імпортматематика
в[2]:математика.гріх(2) Вийти[2]:
0,9092974268256817
в[3]:математика.cos(2) Вийти[3]:-
0,4161468365471424
в[4]:друкувати(в)
['',"імпорт математики",'math.sin(2)','math.cos(2)','print(In)']
в[5]:Вийти
Вийти[5]: {2:0,9092974268256817,3:-0,4161468365471424}
в[6]:друкувати(в[1]) імпорт
математика
TheВийтиоб’єкт — це не список, а словник, що відображає вхідні числа на їхні виходи (якщо такі
є):
в[7]:друкувати(Вийти[2])
0,9092974268256817
в[8]:Вийти[2]**2+Вийти[3]**2
Вийти[8]:1.0
Результат є1.0як ми очікуємо від добре відомої тригонометричної тотожності. У цьому випадку
використання цих попередніх результатів, ймовірно, не є необхідним, але це може стати дуже зручним,
якщо ви виконуєте дуже дорогі обчислення та хочете повторно використати результат!
в[9]:друкувати(_)
1.0
Але IPython йде далі — ви можете використовувати подвійне підкреслення для доступу до
передостаннього виводу та потрійне підкреслення для доступу до передостаннього виведення
(пропускаючи будь-які команди без виведення):
в[10]:друкувати(__)
- 0,4161468365471424
в[11]:друкувати(___)
0,9092974268256817
На цьому IPython зупиняється: більше трьох символів підкреслення стає дещо важко
порахувати, і на цьому етапі легше посилатися на вихід за номером рядка.
в[12]:Вийти[2]
Вийти[12]:0,9092974268256817
в[13]:_2
Вийти[13]:0,9092974268256817
Придушення виводу
Іноді вам може знадобитися придушити вивід інструкції (це, мабуть, найпоширеніше
з командами побудови, які ми досліджуватимемо вРозділ 4). Або, можливо, команда,
яку ви виконуєте, створює результат, який ви б не хотіли зберігати в історії виводу,
можливо, щоб його можна було звільнити, коли інші посилання буде видалено.
Найпростіший спосіб придушити вихід команди – додати крапку з комою в кінці
рядка:
в[14]:математика.гріх(2)+математика.cos(2);
в[15]:14вOut Out[15
]:помилковий
Для одночасного доступу до групи попередніх введених даних %історіїчарівна команда дуже
допомагає. Ось як ви можете надрукувати перші чотири введення:
в[16]:%історії-п. 1-4
1:імпортматематика
2:математика.гріх(2)
3:математика.cos(2)
4:друкувати(в)
Далі припускається, що ви користуєтеся Unix-подібною системою, як-от Linux або Mac OS X. Деякі
з наведених нижче прикладів не працюватимуть у Windows, яка за замовчуванням використовує
інший тип оболонки (хоча у 2016 році було анонсовано рідний Bash оболонок у Windows,
незабаром це може більше не бути проблемою!). Якщо ви не знайомі з командами оболонки, я
пропоную переглянутиПідручник з оболонкизібрані незмінно відмінною організацією Software
Carpentry Foundation.
Хтось, не знайомий із оболонкою, може запитати, навіщо вам це турбуватись, коли ви можете
досягти багатьох результатів, просто клацаючи піктограми та меню. Користувач оболонки може
відповісти іншим запитанням: навіщо шукати піктограми та клацати меню, коли ви можете
виконувати завдання набагато легше, набравши текст? Хоча це може звучати як типовий
безвихідь у технічних перевагах, коли вийти за межі основних завдань, швидко стає зрозуміло,
що оболонка пропонує набагато більше контролю над складними завданнями, хоча, правда,
крива навчання може налякати середнього користувача комп’ютера.
osx:проекти$pwd
/home/jake/projects
osx:проекти$ls
datasci_book mpld3 myproject.txt
osx:проекти$компакт-дискмій проект/
в[1]:!ls
мій проект.txt
в[2]:!pwd
/додому/Джейк/проекти/мій проект
в[4]:вміст= !ls
в[5]:друкувати(вміст) [
'myproject.txt']
в[6]:каталог= !pwd
в[7]:друкувати(каталог)
['/Users/jakevdp/notebooks/tmp/myproject']
в[8]:типу(каталог) IPython.
утиліти.текст.SList
Це виглядає та діє дуже схоже на список Python, але має додаткові функції, такі якgrepіполя
методи таs, n,історвластивості, які дозволяють шукати, фільтрувати та відображати результати
зручними способами. Для отримання додаткової інформації про них ви можете скористатися
вбудованими функціями довідки IPython.
в[10]:!луна{повідомлення}
привітвідPython
Якщо ви деякий час пограєте з командами оболонки IPython, ви можете помітити, що ви не можете використовувати !
в[11]:!pwd
/додому/Джейк/проекти/мій проект
в[12]:!компакт-диск..
в[13]:!pwd
/додому/Джейк/проекти/мій проект
в[14]:%компакт-диск.. /
додому/Джейк/проекти
в[15]:cd myproject
/додому/Джейк/проекти/мій проект
крім %cd,інші доступні магічні функції, подібні до оболонки, становлять %cat, %cp, %env, %ls, %man,
%mkdir, %more, %mv, %pwd, %rm,і %rmdir,будь-який з яких можна використовувати без знака %,
якщоавтомагіяувімкнено. Це робить так, що ви можете сприймати підказку IPython так, ніби це
звичайна оболонка:
в[16]:mkdir tmp
в[17]:ls
мій проект.txt tmp/
в[19]:ls tmp
myproject.txt
в[20]:пд-r tmp
Цей доступ до оболонки з того самого вікна терміналу, що й ваш сеанс Python,
означає, що під час написання коду Python набагато менше перемикання між
інтерпретатором і оболонкою.
Розробка коду та аналіз даних завжди вимагають спроб і помилок, і IPython містить
інструменти для оптимізації цього процесу. У цьому розділі коротко описано деякі
параметри керування звітами про винятки Python, а потім досліджено інструменти для
налагодження помилок у коді.
в[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а=х
в[3]:%xmode Plain
в[4]:функція2(1)
-----------------------------------------------------------
Відстеження (останній останній виклик):
в[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а=х
Ця додаткова інформація може допомогти вам звузити розуміння причини виникнення винятку.
Тож чому б не використатиБагатослівнийрежим весь час? Оскільки код стає складнішим, такий
тип відстеження може стати надзвичайно довгим. Залежно від контексту, іноді від стислості
За замовчуваннямз режимом легше працювати.
Існує багато способів запуску та використання обох цих налагоджувачів; ми не будемо розглядати їх
повністю тут. Зверніться до онлайн-документації цих двох утиліт, щоб дізнатися більше.
Давайте розглянемо останній виняток, а потім виконаємо кілька основних завдань — надрукуємо значення
в[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> вийти
в[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> вийти
Якщо ви бажаєте, щоб налагоджувач запускався автоматично щоразу, коли виникає виняткова ситуація, ви
в[9]:%xmode Plain
%pdb на
функція2(1)
Помилки та налагодження | 23
Файл "<ipython-input-1-d849e34d61fb>", рядок 2, у func1
повернення a / b
> <ipython-input-1-d849e34d61fb>(2)func1() 1
def func1(a, b):
---->2 повернення a / b
3
ipdb> print(b)
0
ipdb> вийти
Нарешті, якщо у вас є сценарій, який ви хочете запустити з самого початку в інтерактивному режимі, ви
можете запустити його за допомогою команди %запустити -d,і використовуйтенаступнийкоманда для
інтерактивного переходу по рядках коду.
Команда опис
список Показати поточне розташування у файлі
h(допомога) Показати список команд або знайти довідку щодо певної команди.
Але як тільки ваш код запрацює, буде корисно трохи покопатися в його ефективності.
Іноді корисно перевірити час виконання певної команди або набору команд; іноді
корисно заглибитися в багаторядковий процес і визначити, де є вузьке місце в
складній серії операцій. IPython надає доступ до широкого спектру функціональних
можливостей для такого типу синхронізації та профілювання коду. Тут ми
обговоримо такі магічні команди IPython:
% часу
Час виконання окремого оператора
%timeit
Час повторного виконання одного оператора для більшої точності
% обрізати
%lprun
Запустіть код за допомогою построкового профайлера
%memit
Виміряйте використання пам’яті одним оператором
%mprun
Запустіть код із построковим профайлером пам’яті
Останні чотири команди не входять до складу IPython — вам потрібно буде інсталювати
line_profilerіmemory_profilerрозширення, які ми обговоримо в наступних
розділах.
в[1]:%timeitсума(діапазон(100))
в[2]:%%timeit
всього=0
дляiвдіапазон(1000):
дляjвдіапазон(1000):
всього+=i*(-1)**j
Іноді повторна операція – не найкращий варіант. Наприклад, якщо у нас є список, який ми хотіли б
відсортувати, нас може ввести в оману повторна операція. Сортування попередньо відсортованого списку
відбувається набагато швидше, ніж сортування невідсортованого списку, тому повторення спотворить
результат:
в[3]:імпортвипадковий
Л=[випадковий.випадковий()дляiвдіапазон(100000)] %
timeit Л.сортувати()
Для цього %часмагічна функція може бути кращим вибором. Це також хороший вибір для тривалих
команд, коли короткі, пов’язані з системою затримки навряд чи вплинуть на результат. Розглянемо час
сортування невідсортованого та попередньо відсортованого списку:
в[4]:імпортвипадковий
Л=[випадковий.випадковий()дляiвдіапазон(100000)]
друкувати("сортування несортованого списку:") %час Л.
сортувати()
Зверніть увагу, наскільки швидше сортується попередньо відсортований список, але також зверніть
увагу, скільки часу займає час із %часпроти %timeit,навіть для попередньо відсортованого списку! Це
результат того факту, що %timeitробить деякі розумні речі під капотом, щоб запобігти втручанню
системних викликів у синхронізацію. Наприклад, він запобігає очищенню невикористаних об’єктів
Python (відомих якзбір сміття), які інакше можуть вплинути на час. З цієї причини, %timeitрезультати
зазвичай помітно швидше ніж %часрезультати.
Для %часЯк і в випадку %timeit,використання магічного синтаксису клітинки з подвійним знаком відсотка дозволяє
Час ЦП: користувач 504 мс, система: 979 мкс, загальна: 505 мс
Час стіни: 505 мс
Для отримання додаткової інформації про %часі %timeit,а також їхні доступні параметри,
скористайтеся довідкою IPython (тобто введіть%час?у підказці IPython).
в[7]:захсума_списків(Н):
всього=0
дляiвдіапазон(5):
Л=[j^(j>>i)дляjвдіапазон(Н)] всього+=
сума(Л) поверненнявсього
Тепер ми можемо викликати %обрізатиза допомогою виклику функції, щоб побачити профільовані результати:
в[8]:%обрізати суму_списків(1000000)
Результатом є таблиця, яка вказує, у порядку загального часу на кожен виклик функції, де
виконання витрачає найбільше часу. У цьому випадку основна частина часу виконання
припадає на розуміння списку всерединісума_списків.З цього моменту ми можемо почати
думати про те, які зміни ми можемо внести, щоб покращити продуктивність алгоритму.
в[9]:%load_ext line_profiler
Як і раніше, блокнот надсилає результат на пейджер, але виглядає він приблизно так:
Таймер: 1е-06 с
Інформація вгорі дає нам ключ до читання результатів: час повідомляється в мікросекундах, і ми
можемо побачити, де програма витрачає найбільше часу. На даний момент ми можемо
використовувати цю інформацію, щоб змінити аспекти сценарію та покращити його
продуктивність для нашого бажаного випадку використання.
Для отримання додаткової інформації про %lprun,а також доступні параметри, скористайтеся
довідкою IPython (тобто введіть%lprun?у підказці IPython).
в[12]:%load_ext memory_profiler
в[13]:%memit sum_of_lists(1000000)
в[14]:%%файлmprun_demo.py
захсума_списків(Н):
всього=0
дляiвдіапазон(5):
Л=[j^(j>>i)дляjвдіапазон(Н)] всього+=
сума(Л)
делЛ#видалити посилання на Л
поверненнявсього
Перезапис mprun_demo.py
Тепер ми можемо імпортувати нову версію цієї функції та запустити профайлер ліній
пам’яті:
в[15]:відmprun_demoімпортсума_списків
%mprun-f сума_списків сума_списків(1000000)
Для отримання додаткової інформації про %меміті %mprun,а також їхні доступні параметри,
скористайтеся довідкою IPython (тобто введіть%Меміт?у підказці IPython).
Веб-ресурси
Веб-сайт IPython
Веб-сайт IPython містить посилання на документацію, приклади, навчальні посібники та
різноманітні інші ресурси.
Веб-сайт nbviewer
На цьому сайті показано статичні візуалізації будь-якого блокнота IPython, доступного в Інтернеті. На
головній сторінці представлено приклади блокнотів, які ви можете переглянути, щоб дізнатися, для чого
інші люди використовують IPython!
Відеоуроки
Шукаючи в Інтернеті, ви знайдете багато відеозаписаних посібників з IPython. Я б
особливо рекомендував шукати навчальні посібники на конференціях PyCon, SciPy та
PyData від Фернандо Переса та Браяна Грейнджера, двох основних творців і
супроводжувачів IPython і Jupyter.
Книги
Нарешті, нагадування про те, що ви можете знайти допомогу самостійно: функція довідки IPython на
основі ? (обговорюється в«Довідка та документація в IPython» на сторінці 3) може бути дуже корисним,
якщо ви використовуєте його добре та часто. Переглядаючи приклади тут і в інших місцях, ви можете
використовувати їх, щоб ознайомитися з усіма інструментами, які може запропонувати IPython.