{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Введение в библиотеку `pandas`\n", "\n", " \n", "**С.В. Лемешевский** (email: `sergey.lemeshevsky@gmail.com`), Институт математики НАН Беларуси\n", "\n", "Date: **Mar 31, 2020**\n", "\n", "Библиотека `pandas` содержит структуры данных и инструменты\n", "управления данными, предназначенные для очистки данных и быстрого и\n", "простого анализа данных в Python. Библиотека `pandas` часто\n", "используется в тандеме с инструментами для численных расчетов, такими\n", "как NumPy и SciPy, библиотеками для анализа данных, такими как\n", "`statmodels` и `scikit-learn`, и библиотеками для визуализации, такими\n", "как `matplotlib`.\n", "\n", "Ниже будем использовать следующее соглашение для импорта библиотеки\n", "`pandas`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "# Структуры данных в `pandas`\n", "
\n", "\n", "Чтобы начать работать с `pandas`, рассмотрим две основные структуры:\n", "`Series` и `DataFrame`. Они не являются универсальными решениями любых\n", "задач, однако эти структуры предоставляют прочный легкий в\n", "использовании фундамент для большинства приложений." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Класс `Series`\n", "
\n", "\n", "`Series` (*ряд*) — объект, типа одномерного массива, содержащий\n", "последовательность значений (типов, аналогичных типам NumPy) и\n", "связанный с ним массив меток данных,\n", "называемых *индексами*. Создадим простейший объект типа `Series`\n", "только из массива данных:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series([4, 7, -5, 3])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Строковое представление объекта `Series` в интерактивном режиме\n", "отображает индексы слева, а данные справа. Так как мы не определили\n", "индексы, то по умолчанию индексы содержат целые числа от `0` до `N-1`\n", "(где `N` — длина массива данных). Можно получить представление в виде\n", "массива и индексы ряда с помощью атрибутов `values` и `index`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.values" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Часто желательно создать ряд с индексами, идентифицирующими каждую\n", "точку данный с меткой:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В отличие от массивов NumPy, можно использовать метки при индексации\n", "при выборе отдельных значений или набора значений:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2['a']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2['d'] = 6" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2[['c', 'a', 'd']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Использование функций NumPy или операций подобных NumPy, таких как\n", "фильтрация с помощью булевых массивов, умножение на скаляр или\n", "вычисление математических функций, сохраняет значения индексов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2[obj2 > 0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2 * 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "np.exp(obj2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ряды можно рассматривать как словари фиксированной длины:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "'b' in obj2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "'e' in obj2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если имеются данные, содержащиеся в словаре, можно создать ряд из\n", "него:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3 = pd.Series(sdata)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если передается только словарь, то индексами ряда будут ключи словаря\n", "в том порядке, в котором были при создании словаря. Можно изменить\n", "порядок индекса передавая ключи словаря в порядке, который нужен:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "states = ['California', 'Ohio', 'Oregon', 'Texas']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4 = pd.Series(sdata, index=states)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Здесь три значения, найденные в `sdata`, были размещены в\n", "соответствующих местах, но так как не было найдено значение для\n", "`'California'`, оно отображается как `NaN` (не число), которое в\n", "`pandas` используется для обозначение пропущенных значений или\n", "значений «NA» (*not available*). Поскольку `'Юта'` не была включена в `states`,\n", "этот элемент исключается из результирующего объекта. Функции `isnull`\n", "и `notnull` в `pandas` используются для обнаружения отсутствующих\n", "данных:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pd.isnull(obj4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pd.notnull(obj4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Класс `Series` также имеет эти методы:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4.isnull()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Полезное свойство `Series` заключается в том, что она автоматически\n", "происходит выравнивание по индексам в арифметических операциях:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3 + obj4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как объекты `Series`, так и из индексы имеют атрибут `name`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4.name = 'population'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4.index.name = 'state'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно изменять индексы рядов присваиванием:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Класс `DataFrame`\n", "
\n", "\n", "`DataFrame` представляет собой прямоугольную таблицу данных и содержит\n", "упорядоченную коллекцию столбцов, каждый из которых может иметь\n", "различный тип значения (числовой, строковый, логический и\n", "т.д.). `DataFrame` имеет индексы столбцов и строк.\n", "\n", "Есть много способов создания объекта `DataFrame`, хотя один из\n", "наиболее распространенных — это использование списков, словарей или\n", "массивов NumPy:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],\n", " 'year': [2000, 2001, 2002, 2001, 2002, 2003], \n", " 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Полученный в результате `DataFrame` получит автоматически индексацию\n", "для строк (как в `Series`), а индексом столбцов будут ключи словаря:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если используется блокнот Jupyter, объекты `DataFrame` будут\n", "отображаться в виде более удобной для просмотра HTML-таблицы.\n", "\n", "Для больших DataFrames метод head выбирает только первые пять строк:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно задавать другой порядок столбцов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pd.DataFrame(data, columns=['year', 'state', 'pop'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если передать столбец, который не содержится в словаре, то в\n", "результате будет столбец с отсутствующими значениями:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "К столбцу `DataFrame` можно получить доступ как к ряду с помощью\n", "нотацией подобной словарю или через атрибут:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2['state']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2.year" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Замечание.**\n", ">\n", "> IPython предоставлет доступ по атрибуту (например, `frame2.year`) \n", "> по автодополнению с помощью клавиши .\n", "> \n", "> Вариант `frame2[column]` работает для любых имен столбцов, в то время\n", "> как `frame2.column` работает только если имя столбца является\n", "> допустимым в Python именем переменной.\n", "\n", "\n", "\n", "\n", "\n", "К строкам можно получить доступ по позиции или с помощью специального\n", "атрибута `loc`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2.loc['three']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно менять значения столбцов. Например, пустой столбцу `debt` можно\n", "присвоить скалярное значение или массив:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2['debt'] = 16.5" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2['debt'] = np.arange(6.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "При присваивании столбцу списка или массива, их длина должна быть той\n", "же, что и длина `DataFrame`. Если присваивать объект `Series`, то его\n", "метки будут выровнены по индексу `DataFrame`, при этом будут\n", "вставляться отсутствующие значения для любых «дыр»:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2['debt'] = val" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "При присваивании отсутствующего столбца в объекте `DataFrame`\n", "добавится новый столбец. Ключевое слово `del` удаляет столбец, как и\n", "для словарей:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2['eastern'] = frame2.state == 'Ohio'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Предупреждение.**\n", ">\n", "> Новый столбец не может быть добавлен с помощью синтаксиса `frame2.eastern`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "del frame2['eastern']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Предупреждение.**\n", ">\n", "> Столбец, возвращаемый при индексации `DataFrame`, является\n", "> представлением данных, а не копией. Таким образом, любые\n", "> изменения в объекте `Series` будут отражены в объекте\n", "> `DataFrame`. Столбец можно явно скопировать с помощью метода\n", "> `Series.copy`.\n", "\n", "\n", "\n", "\n", "\n", "Другой распространенной формой представления данных является вложенный\n", "словарь словарей:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если вложенный словарь передать в конструктор `DataFrame`, `pandas`\n", "интерпретирует ключи внешнего словаря как столбцы, а внутренние ключи\n", "— как индексы:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3 = pd.DataFrame(pop)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно транспонировать `DataFrame`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно задать порядок индексов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pd.DataFrame(pop, index=[2001, 2002, 2003])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Словари рядов обрабатываются практически также:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pdata = {'Ohio': frame3['Ohio'][:-1], 'Nevada': frame3['Nevada'][:2]}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "pd.DataFrame(pdata)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Полный список параметров, которые можно передавать в конструктор\n", "`DataFrame`, можно найти в таблице [pandas:data-struct:tbl:1](#pandas:data-struct:tbl:1).\n", "\n", "Если для индекса и столбцов DataFrame установлены атрибуты `name`, они\n", "также будут отображены:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3.index.name = 'year'; frame3.columns.name = 'state'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как и в случае `Series`, атрибут `values` возвращает данные,\n", "содержащиеся в `DataFrame`, в виде двумерного массива:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 1 : Возможные входные данные для конструктора `DataFrame`
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Тип Примечания
Двумерный ndarray Матрица данных, передающаяся с необязательными метками строк и столбцов
dict массивов, list, tuple Каждая последовательность становится столбцом в DataFrame. Все последовательности должны быть одинаковой длины
Структурированный массив (или массив записей) NumPy Обрабатывается как предыдущий случай
dict объектов типа Series Каждое значение становится столбцом. Индексы из каждой серии объединяются вместе, чтобы сформировать индекс строки результата, если не передан явный индекс
dict объектов типа dict Каждый внутренний словарь становится столбцом. Ключи объединяются для формирования индекса строки, как в предыдущем случае
list объектов dict или Series Каждый элемент становится строкой в DataFrame. Оббъединение ключей dict или индексов Series становится метками столбцов DataFrame
list объектов list или tuple Обрабатывается как случай двумерного массива
DataFrame Используются индексы DataFrame , если не переданы другие
маскированный массив NumPy Как случай двумерного массива, за исключением того, что маскированные значения становятся пропущенными (NA) значениями в итоговом DataFrame
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Объекты типа `Index`\n", "
\n", "\n", "Объекты типа `Index` в `pandas` отвечают за хранение меток осей и\n", "других метаданных (таких как имя или имя оси). \n", "\n", "Любой массив или другая последовательность меток, которые используются\n", "при создании `Series` или `DataFrame`, преобразуется в `Index`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series(range(3), index=['a', 'b', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "index = obj.index" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "index" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "index[1:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объекты `Index` — неизменяемый тип и не может изменяться\n", "пользователем:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "index[1] = 'd'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Неизменяемость делает более безопасным совместное использование объектов\n", "`Index`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "labels = pd.Index(np.arange(3))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "labels" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2 = pd.Series([1.5, -2.5, 0], index=lables)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2.index is lables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "С объектами `Index` можно работать как с массивами фиксированного\n", "размера:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame3.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "'Ohio' in frame3.columns" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "2003 in frame3.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В отличие от множеств Python объекты `Index` могут содержать\n", "повторяющиеся метки:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "dup_labels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Каждый объект `Index` имеет ряд методов и свойств. Некоторые полезные\n", "из них приведены в таблице [pandas:data-struct:tbl:2](#pandas:data-struct:tbl:2). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 2 : Некоторые методы и свойства `Index`
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Метод Описание
append Добавляет дополнительные объекты Index, создавая новый объект Index
difference Возвращает разность множеств как Index
intersection Возвращает пересечение множеств
union Возвращает объединение множеств
isin Возвращает логический массив, указывающий, содержится ли каждое значение в переданной коллекции
delete Возвращает новый объект Index с удаленным элементом по индексу i
drop Возвращает новый объект Index, удаляя переданные значения
insert Возвращает новый объект Index, вставляя по индексу i элемент
is_monotonic Возвращает True, если каждый элемент больше либо равен предыдущего
is_unique Возвращает True, если объект Index не содержит дупликатов
unique Возвращает массив уникальных занчений в объекте Index
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Основная функциональность\n", "
\n", "\n", "Приведем основные подходы к работе с данными, содержащимися в `Series`\n", "и `DataFrame`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Переиндексация\n", "
\n", "\n", "Важный метод в объектах `pandas` — это `reindex`, который создает\n", "новый объект с данными, согласованными с новым индексом. Рассмотрим\n", "пример:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вызов `reindex` в объекте `Series` переупорядочивает данные в\n", "соответствии с новым индексом, вводя пропущенные значения, если\n", "какие-либо значения индекса еще не присутствовали:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ля упорядоченных данных, таких как временные ряды, может быть\n", "желательно выполнить некоторую интерполяцию или заполнение значений\n", "при переиндексации. Аргумент `method` позволяет нам сделать это,\n", "используя метод такой как `ffill` (forward-fill), который заполняет\n", "«вперед» значениями ряд:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj3.reindex(range(6), method='ffill')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В объектах `DataFrame` метод `reindex` может изменять либо индекс\n", "(строки), столбцы, либо и то и то. Когда передается только одна\n", "последовательность, то переиндексируются строки:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2 = frame.reindex(['a', 'b', 'c', 'd'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Столбцы переиндексируются с помощью аргумента `columns`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "states = ['Texas', 'Utah', 'California']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.reindex(columns=states)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таблице [pandas:functionality:tbl:1](#pandas:functionality:tbl:1) представлены аргументы\n", "функции `reindex`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 3 : Аргументы функции `reindex`
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Аргумент Описание
index Новая последовательность для использования в качестве индекса. Может быть экземпляром Index или любой последовательности Python
method Метод интерполяции (заполнения): ffil (forward-fill) — прямое заполнение, bfill (backward-fill) — обратное заполнение
fill_value Подставляется это значения при заполнении пропущенных данных, которые появляются при переиндексации
limit При заполнении задает максимальный размер шага (по количеству элементов) заполнения
tolerance При заполнении задает максимальный размер шага (в абсолютном числовом расстоянии) для заполнения неточных совпадений
level Сопоставляет простой Index на уровне MultiIndex; в противном случае выбирает подмножество
copy Если True, всегда копирует данные, даже если новый индекс эквивалентен старому; если False не копирует данные, если индексы эквивалентны
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Удаление записей с оси\n", "
\n", "\n", "Удалить одну или несколько записей легко, если имеется массив или\n", "список индексов, которые не содержат эти записи. Поскольку это может\n", "потребовать некоторых операций над множествами, метод `drop`\n", "возвращает новый объект с указанными значениями, удаленными с оси:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "new_obj = obj.drop('c')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.drop(['d', 'c'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В `DataFrame` значения индекса могут быть удалены с любой оси:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "data = pd.DataFrame(np.arange(16).reshape((4, 4)), index=['Ohio', 'Colorado', 'Utah', 'New York'], columns=['one', 'two', 'three', 'four'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вызов `drop` с последовательностью меток удаляет значения из меток\n", "строк (ось `0`):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "data.drop(['Colorado', 'Ohio'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Удалить значения в столбцах можно передавая параметр `axis=1` или\n", "`axis=columns`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "data.drop('two', axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "data.drop(['two', 'four'], axis='columns')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Многие функции, такие как `drop`, которые изменяют размер или форму\n", "`Series` или `DataFrame`, могут изменять сам объект (*in-place*) без\n", "создания нового объекта:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.drop('c', inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **Предупреждение.**\n", ">\n", "> Будьте осторожны с параметром `inplace`, так как происходит **удаление**\n", "> данных.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Арифметические операции и выравнивание данных\n", "
\n", "\n", "Важной особенностью `pandas` для некоторых приложений является поведение\n", "арифметических операций между объектами с разными индексами. При\n", "сложении объекты в случае, когда любые пары индексов отличаются,\n", "соответствующий индекс в результате является объединением исходных\n", "индексов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "s1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "s2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "s1 + s2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выравнивание данных вводит пропущенные значения в местах\n", "меток, которые не пересекаются. Пропущенные значения будут\n", "распространяться в дальнейших арифметических вычислениях.\n", "\n", "В случае `DataFrame` выравнивание осуществляется как для строк, так и\n", "для столбцов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'), \n", " \t index=['Ohio', 'Texas', 'Colorado'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), \n", " \t index=['Utah', 'Ohio', 'Texas', 'Oregon'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сумма введенных объектов вернет новый объект `DataFrame`, чьи индексы\n", "и столбцы являются объединениями индексов и столбцов двух складываемых\n", "объектов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 + df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так как столбцы `'c'` и `'e'` не находятся одновременно в обоих\n", "объектах `DataFrame`, в результате они содержат отсутствующие\n", "значения. Такое же происходит и со строками.\n", "\n", "Если сложить объекты `DataFrame` без общих меток столбцов или строк,\n", "результат будет содержать все отсутствующие значения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 = pd.DataFrame({'A': [1, 2]})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2 = pd.DataFrame({'B': [3, 4]})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 - df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Арифметические методы с заполнением значений\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)), columns=list('abcd'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)), columns=list('abcde'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2.loc[1, 'b'] = np.nan" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сложение этих объектов приводит к значениям NA в местах, которые не\n", "перекрываются:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1 + df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для заполнения отсутствующих значений можно воспользоваться функцией\n", "`add` с дополнительным аргументом `fill_value`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1.add(df2, fill_value=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таблице [pandas:functionality:tbl:2](#pandas:functionality:tbl:2) представлены методы для\n", "арифметических операций. У каждого из них есть аналог, начинающийся с\n", "буквы `r`, у которого переставлены аргументы. Приведенные ниже\n", "примеры эквивалентны:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "1 / df1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1.rdiv(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Соответственно, при переиндексации `Series` или `DataFrame` вы также\n", "можете указать другое значение заполнения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df1.reindex(columns=df2.columns, fill_value=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 4 : Гибкие арифметические методы
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Метод Описание
add, radd Сложение (+)
sub, rsub Вычитание (-)
div, rdiv Деление (/)
floordiv, rfloordiv Целочисленное деление (//)
mul, rmul Умножение (*)
pow, rpow Возведение в степень (**)
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Операции между объектами `DataFrame` и `Series`\n", "
\n", "\n", "Как и для массивов NumPy разной размерности, существуют арифметические\n", "операции между объектами `DataFrame` и `Series`. В качестве примера\n", "рассмотрим разность между двумерным массивом и одной из его строк:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "arr = np.arange(12.).reshape((3, 4))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "arr[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "arr - arr[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "При вычитании `arr[0]` из `arr`, операция осуществляется для каждой\n", "строки. Операции между `DataFrame` и `Series` производятся аналогично." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), \n", " columns=list('bde'), \n", " index=['Utah', 'Ohio', 'Texas', 'Oregon'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "series = frame.iloc[0]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "По умолчанию арифметические операции между `DataFrame` и `Series`\n", "приводят индексы объекта `Series` к столбцам объекта `DataFrame`,\n", "распространяя операцию по строкам:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame - series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если значение индекса не найдено ни в столбцах `DataFrame`, ни в индексе\n", "`Series`, объекты будут переиндексированы для формирования\n", "объединения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "series2 = pd.Series(range(3), index=['b', 'e', 'f'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame + series2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если вместо согласования по столбцам нужно согласовывать операцию по\n", "строкам, нужно использовать арифметический метод:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "series3 = frame['d']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "series3" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sub(series3, axis='index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Применение функций и отображение\n", "
\n", "\n", "Универсальные функции NumPy также работают с объектами `pandas`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "np.abs(frame)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Другой частой операцией является применение функции к одномерным\n", "массивам для каждого столбца или строки. Метод `apply` объекта\n", "`DataFrame` выполняет это:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "f = lambda x: x.max() - x.min()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.apply(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В результате мы получили объект `Series`, у которого индекс совпадает\n", "со столбцами объекта `DataFrame`.\n", "\n", "Если задать параметр `axis = 'columns'` в функции `apply`, функция\n", "будет применяться к строкам:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.apply(f, axis='columns')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Многие из наиболее распространенных статистических методов\n", "(например, `sum` и `mean`) являются методами `DataFrame`, поэтому \n", "использование `apply` не обязательно. \n", "\n", "Функция, передаваемая в `apply`, не обязана возвращать скалярное\n", "значение, она может также возвращать объект `Series`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "def f(x): \n", " return pd.Series([x.min(), x.max()], index=['min', 'max'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.apply(f)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Также можно использовать поэлементные функции. Предположим, нужно\n", "получить форматированную строку для каждого значения в объекте\n", "`frame`. Это можно реализовать с помощью функции `applymap`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "format = lambda x: '%.2f' % x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.applymap(format)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В функции `applymap` используется метод `map` класса `Series`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame['e'].map(format)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Сортировка и ранжирование\n", "
\n", "\n", "Одна из важных встроенных операций — это сортировка данных. Для того,\n", "чтобы выполнить лексикографическую сортировку по индексам строк или\n", "столбцов, можно использовать функцию `sort_index`, которая возвращает\n", "новый отсортированный объект:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series(range(4), index=['d', 'a', 'b', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.sort_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объект `DataFrame` можно сортировать по индексам на любой оси:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d', 'a', 'b', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sort_index()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sort_index(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Данные сортируются по возрастанию по умолчанию, но могут быть\n", "отсортированы также по убыванию:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sort_index(axis=1, ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для сортировки объекта `Series` по значениям используется метод\n", "`sort_values`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series([4, 7, -3, 2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.sort_values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Все пропущенные значения по умолчанию сортируются в конец объекта\n", "`Series`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series([4, np.nan, 7, np.nan, -3, 2])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.sort_values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "При сортировке объекта `DataFrame` можно использовать данные в одном\n", "или нескольких столбцах в качестве ключей для сортировки. Чтобы\n", "выполнить это, необходимо передать имя одного или нескольких столбцов\n", "параметру `by` метода `sort_vlues`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sort_values(by='b')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для сортировки по нескольким столбцам, необходимо передать список\n", "имен столбцов:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.sort_values(by=['a', 'b'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Ранжирование* заключается в присвоении *ранга* от единицы до числа значений в \n", "массиве. Объекты `Series` и `DataFrame` имеют метод `rank`, который по\n", "умолчанию разрывает связи, присваивая каждой группе среднее значение\n", "ранга:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series([7, -5, 7, 4, 2, 0, 4])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.rank()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ранги также могут быть назначены в соответствии с порядком, в котором\n", "они наблюдаются в данных:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.rank(method='first')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Здесь вместо использования среднего ранга $6.5$ для записей с\n", "индексами `0` и `2` они вместо этого были установлены на $6$ и $7$,\n", "потому что метка $0$ предшествует метке $2$ в данных.\n", "\n", "В таблице [pandas:functionality:tbl:3](#pandas:functionality:tbl:3) представлен перечень методов\n", "построения ранга.\n", "\n", "Объект `DataFrame` может вычислять ранги по строкам или по столбцам:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1], 'c': [-2, 5, 8, -2.5]})" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "frame.rank(axis='columns')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 5 : Методы ранжирования
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Метод Описание
average Используется по умолчанию. Присваивает среднее значение ранга каждому значению в группе
min Использует минимальный ранг для всей группы
max Использует максимальный ранг для всей группы
first Присваивает ранги в порядке появления значений в данных
dense Как method = 'min', но ранги между группами всегда увеличиваются на 1, а не на количество равных элементов в группе
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Индексация с повторяющимися метками\n", "
\n", "\n", "В рассматриваемых выше примерах индексы имели единственные значения,\n", "без повторений. Хотя многие функции библиотеки `pandas` (например,\n", "`reindex`) требуют, чтобы метки были уникальными, это не\n", "обязательно. Рассмотрим ряд с повторяющимися индексами:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "У объекта `Index` есть атрибут `is_unique`, который дает информацию\n", "являются ли метки индекса уникальными:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.index.is_unique" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В случае, когда несколько данных имеют одинаковые метки, обращение по\n", "этому индексу вернет объект `Series`, в то время как для меток без\n", "дублирования возвращается скалярное значение:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj['a']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj['c']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Та же логика распространяется и на индексирование строк в `DataFrame`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.loc['b']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "# Описательная и сводная статистика\n", "
\n", "\n", "Объекты\t`pandas` оснащены набором общих математических и\n", "статистических методов. Большинство из них попадают в категорию\n", "сводной статистики. В отличие от соответствующих методов массивов\n", "NumPy методы объектов `pandas` имеют встроенную обработку пропущенных\n", "значений. Рассмотрим небольшой объект `DataFrame`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df = pd.DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вызов метода `sum` возвращает суммы значений по столбцам:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы получить суммы значений по строкам нужно передать параметр\n", "`axis='columns'` или `axis=1`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.sum(axis='columns')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Значения NA исключаются, если только весь срез (в данном случае строка\n", "или столбец) не равен NA. Это поведение можно изменить с помощью\n", "параметра `skipna`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.mean(axis='columns', skipna=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Некоторые методы, такие как `idxmin` и `idxmax`, возвращают косвенную \n", "статистику, такую как значение индекса, где достигаются минимальные\n", "или максимальные значения:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.idxmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Есть методы являются аккумулирующими:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.cumsum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Метод `describe` возвращает множественную суммарную статистику:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На нечисловых данных метод `describe` возвращает следующую информацию:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj = pd.Series(['a', 'a', 'b', 'c'] * 4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "obj.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В таблице [pandas:statistics:tbl:1](#pandas:statistics:tbl:1) представлен полный список\n", "методов сводной статистики и связанных с этим методов:\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Таблица 6 : Описательная и сводная статистика
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Метод Описание
count Количество нечисловых значений
describe Вычисляет сводную статистику для ряда или для каждого столбца объекта DataFrame
min, max Вычисляет минимальное и максимальное значение
argmin, argmax Возвращают индекс (целое число), где расположено минимальное или максимальное значение
idxmin, idxmax Возвращают метку индекса, где расположено минимальное или максимальное значение
quantile Вычисляет квантиль выборки от 0 до 1
sum Сумма значений
mean Среднее значение
median Медиана (50-процентная квантиль) значений
mad Среднее абсолютное отклонение от среднего значения
prod Произведение значений
var Дисперсия множества выборки значений
std Стандартное отклонение выборки значений
skew Асимметрия (третий момент) выборки значений
kurt Эксцесс (четвертый момент) выборки значений
cumsum Накопленная сумма значений
cummin, cummax Совокупный минимум и максимум
cumprod Накопленное произведение значений
diff Вычисляет первую арифметическую разность (полезно для временных рядов)
pct_change Вычисляет процентные изменения
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Чтение и запись данных\n", "
\n", "\n", "В библиотеке `pandas` реализованы функции чтения табличных данных в\n", "объект `DataFrame`. В таблице [pandas:rwdata:tbl:1](#pandas:rwdata:tbl:1) представлены\n", "некоторые из таких функций.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Таблица 7 : Функции чтения данных
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Функция Описание
read_csv Загружает разделенные значения из файла или файлоподобного объекта; в качестве разделителя по умолчанию используется запятая
read_table Загружает разделенные значения из файла или файлоподобного объекта; в качестве разделителя по умолчанию используется табуляция ('\\t')
read_fwf Читает данные в формате со столбцами фиксированной длины (без разделителей)
read_clipboard Версия функции read_table, которая читает данные из буфера обмена
read_excel Читает данные из файлов формата .xls или .xlsx
read_hdf Читает файлы вормата HDF5, записанные с помощью библиотеки pandas
read_html Читает все таблицы из заданного документа HTML
read_json Читает данные из JSON (JavsScript Object Notation)
read_msgpack Читает данные pandas закодированные с помощью двоичного формата MessagePack
read_pickle Читает любой объект, сохраненный в формате Python pickle
read_sas Читает набор данных SAS, хранящийся в одном из пользовательских форматов хранения системы SAS
read_sql Читает результат запроса SQL (используя SQLAlchemy) как объект DataFrame
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Библиотека `pandas` поддерживает нативную работу со многими\n", "реляционными БД.\n", "\n", "Можно не только загружать данные из локальных файлов, но и из\n", "Интернета — достаточно вместо адреса на локальном компьютере указать\n", "прямю ссылку на файл.\n", "\n", "Также существует дополнительный пакет, который называется\n", "`pandas_datareader`. Если он не установлен, его можно установить через\n", "`conda` или `pip`. Он загружает данные из некоторых\n", "источников. Загрузим с помощью `pandas_datareader` некоторые данные\n", "для некоторых биржевых тикеров:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import pandas_datareader.data as web\n", "\n", "all_data = {ticker: web.get_data_yahoo(ticker)\n", " for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}\n", "price = pd.DataFrame({ticker: data['Adj Close']\n", " for ticker, data in all_data.items()})\n", "volume = pd.DataFrame({ticker: data['Volume']\n", " for ticker, data in all_data.items()})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вычислим изменение процентные изменения цен:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns = price.pct_change()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns.tail()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Метод `corr` объекта `Series` вычисляет корреляцию перекрывающихся,\n", "выровненных по индексу значений в двух объектах\n", "`Series`. Соответственно `cov` вычисляет ковариацию:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns['MSFT'].corr(returns['IBM'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns['MSFT'].cov(returns['IBM'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Поскольку `MSFT` является допустимым атрибутом Python, мы также можем\n", "выбрать эти столбцы, используя более краткий синтаксис" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns.MSFT.corr(returns.IBM)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Методы `corr` и `cov` объекта `DataFrame` возвращают полные матрицы\n", "корреляции или ковариации:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns.corr()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns.cov()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Используя метод `corrwith` объекта `DataFrame`, можно вычислять попарные\n", "корреляции между столбцами или строками `DataFrame` с другими\n", "объектами `Series` или `DataFrame`. Передача в качестве аргумента ряда\n", "возвращает ряд со значением корреляции, вычисленным для каждого\n", "столбца:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "returns.corrwith(returns.IBM)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "\n", "\n", "# Задания\n", "
\n", "\n", "\n", "Предлагается поработать с\n", "[набором данных](https://data.lacity.org/A-Safe-City/Crime-Data-from-2010-to-2019/63jg-8b9z)\n", "о преступности в Лос-Анджелесе.\n", "\n", "Результат работы должен быть в виде блокнота Jupyter. Все задачи в\n", "одном блокноте, например, `pandas-da-ans.ipynb`.\n", "\n", "Для построения графических данных смотрите главу [Графическая \n", "визуализация данных](visual.ipynb)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Быстрый анализ данных\n", "
\n", "\n", "* Загрузите [случайную выборку](src-pandas/la-crimes-sample.csv.zip) из этого набора.\n", "\n", "* Сколько строк и столбцов в таблице?\n", "\n", "* Каковы названия столбцов?\n", "\n", "* Какие типы данных у столбцов?\n", "\n", "* Сколько в каждом из них уникальных значений?\n", "\n", "* Сколько пропущенных значений?\n", "\n", "* Постройте распределения числовых переменных?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Жертвы\n", "
\n", "\n", "В наборе данных имеется информация о Возрасте, Поле, и Происхождении\n", "каждой жертвы. Есть ли связь между этими признаками? \n", "\n", "* Верно ли, что женщины чаще оказываются жертвами по сравнению с мужчинами?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Преступления, пол и возраст\n", "
\n", "\n", "* Изучите распределение количества преступлений по возрасту. Какова тенденция? Люди какого возраста чаще всего подвергаются преступлениям? Есть ли локальные минимумы? Используйте типы графиков `hist` и `density`. \n", "\n", "* Как различается вероятность женщин и мужчин стать жертвой в зависимости от возраста? Постройте визуализацию. В каком возрастном промежутке мужчины чаще становятся жетрвами преступлений?\n", "\n", "* Определите 10 самых распространенных преступлений в Лос-Анджелесе. Постройте график.\n", "\n", "* От каких преступлений чаще старадют женщины, а от каких мужчины?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Происхождение\n", "
\n", "\n", "\n", "## Таблица 8\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Символ Происхождение
'A' Other Asian
'B' Black
'C' Chinese
'D' Cambodian
'F' Filipino
'G' Guamanian
'H' Hispanic/Latin/Mexican
'I' American Indian/Alaskan Native
'J' Japanesea
'K' Korean
'L' Laotian
'O' Other
'P' Pacific Islander
'S' Samoan
'U' Hawaiian
'V' Vietnamese
'W' White
'X' Unknown
'Z' Asian Indian
\n", "\n", "\n", "* Люди какого происхождения чаще всего подвергаются преступлениям?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Место проишествия\n", "
\n", "\n", "* Отсортируйте районы, по количеству преступлений. Постройте график, показывающий самые безопасный и опасный районы.\n", "\n", "* Люди какого происхождения чаще всего страдают от преступлений в каждом из районов? Не забудьте нормировать на общее количество жертв.\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" }, "toc-autonumbering": false, "toc-showcode": false, "toc-showmarkdowntxt": false, "toc-showtags": false }, "nbformat": 4, "nbformat_minor": 4 }