Как работать jupyter библиотека pandas
Перейти к содержимому

Как работать jupyter библиотека pandas

  • автор:

Introduction

Nikolay Grozev

This article overviews how to quickly set up and get started with the pandas data analysis library. It also lists common code snippets for parsing, loading, and transforming data. For more detailed documentation on pandas’ more advanced features (e.g. plot styling and combining data frames) you’ll need to refer to other sources.

Installing and Importing

First we need to install python and the pip package manager. If you don’t already have them, you can use pyenv to easily install them (tested on Ubuntu and OS X). On Ubuntu, you can follow these instructions to get pyenv. On OS X you can just use brew:

Once you have pyenv, you can install and configure the desired python version as follows:

Now we can use pip to install pandas, the ipython shell, and jupyter.

The last two libraries will allow us to create web base notebooks in which we can play with python and pandas. If you don’t know what jupyter notebooks are you can see this tutorial.

Next, we need to start jupyter. I find it useful to store all notebooks on a cloud storage or a folder under version control, so I can share between multiple machines. This can be achieved with an additional parameter as follows:

Next, we need to import pandas in the first cell of the jupyter notebook.:

Table Of Contents

When we have a long notebook, it is useful to have an automatically generated table of contents (TOC). The following code (Borrowed from this post on StackOverflow) installs the TOC jupyter plugin, i.e.:

Then we need to restart the kernel and make the first cell “Markdown” type and add the following:

When you save the TOC should appear.

Creating Data Frames

Data frames are the central concept in pandas. In essence, a data frame is table with labeled rows and columns. Data frames can be created from multiple sources — e.g. CSV files, excel files, and JSON.

Loading CSV files

Loading a CSV file as a data frame is pretty easy:

Sometimes the CSV file contains padding spaces in front of the values. To ignore them use the skipinitialspaces parameter:

If the padding white spaces occur on both sides of the cell values we need to use a regular expression separator. In this case, we need to use the ‘python’ processing engine, instead of the underlying native one, in order to avoid warnings. This will degrade the performance a bit:

Sometimes we need to sample the data before loading it, as it is too big to fit in memory. This can be achieved following this approach.

Hardcoded Dataframes

Hardcoded data frames can be constructed by providing a hash of columns and their values.

We will reuse this data frame in some subsequent examples.

Previewing Data

To preview the data and the metadata of a dataframe you can use the following functions:

Sorting

The sort_index method is used to sort the frame by one of its axis indices. The axis is either 0 or 1 — row/column axis respectively:

We can also sort by one or multiple columns:

Selecting/Querying

Individual columns can be selected with the [] operator or directly as attributes:

You can also select by absolute coordinates/position in the frame. Indices are zero based:

Most often, we need to select by a condition on the cell values. To do so, we provide a boolean array denoting which rows will be selected. The trick is that pandas predefines many boolean operators for its data frames and series. For example the following expression produces a boolean array:

This allows us to write queries like these:

Modifying Data Frames

Pandas’ operations tend to produce new data frames instead of modifying the provided ones. Many operations have the optional boolean inplace parameter which we can use to force pandas to apply the changes to subject data frame.

It is also possible to directly assign manipulate the values in cells, columns, and selections as follows:

It is often useful to create new columns based on existing ones by using a function. The new columns are often called Derived Characteristics:

Dates and Time

When loading data from a CSV, we can tell pandas to look for and parse dates. The parse_dates parameters can be used for that. In the most typical case, you would pass a list of column names as parse_dates:

This will work for most typical date formats. If it does not (i.e. we have a non-standard date format) we need to supply our own date parser:

Alternatively, if we’ve already loaded the data frame we can change a column from string to a date:

For more on date-time formats look at the documentation.

Often we need to work with Unix/Posix timestamps. Converting numeric timestamps to pandas timestamps is easy with the unit parameter:

If we need to parse Posix timestamps while reading CSVs, we can once again resort to converter functions. In the converter function we can use the pandas.to_datetime utility which accepts a unit parameter:

We can also convert time/timestamp data to Unix epoch numbers:

Plotting

Set Up

Pandas uses matplotlib to render graphs, so you need to install it:

Before we continue we need to test if matplotlib was set up properly. Open a terminal, start the python interpreter, and type:

If the import works without problems you’re good to go. However, sometimes in OS X you may get the following error:

“RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment, see ‘Working with Matplotlib in Virtual environments’ in the Matplotlib FAQ”

If that error occurs, you need to execute the following from terminal:

This will set the proper matplotlib backend, as discussed here.

Now we can import the matplot library in one of the jupyter notebook cells:

There is one last configuration to complete before we can display plots in the web notebook. We need to tell jupyter to display the matplotlib plots as images in the notebook itself. To do so, type the following command in one of the notbook cells:

Basic Plotting

In the rest of this section we’ll use the following data frame:

Data frames have a method called plot. By default, it plots a line chart with al numerical columns. The x-axis is the row index of the data frame. In other words, you’re plotting :

We can also specify a column for the x-axis:

The plot has an optional parameter kind which can be used to plot the data in different type of visualisation — e.g. bar harts, pie chart, or histograms.

Using kind=’bar’ produces multiple plots — one for each row. In each plot, there’s a bar for each cell.

Boxplots are displayed with the kind=’box’ options. Each box represents a numeric column.

Интерактивные отчеты в Jupyter Notebook

Jupyter Notebook — важный инструмент для специалиста по науке о данных. С его помощью можно выполнять базовые задачи, такие как очистка данных, визуализация, создание моделей машинного обучения и многие другие. В Jupyter Notebook можно использовать Python и R (в зависимости от ядра), сохранять результаты выполнения кода в ячейках и делиться ими с другими людьми.

Анализ данных в Python

В Python можно группировать данные и создавать сводные таблицы с помощью встроенных функций из библиотеки pandas.

Классический способ создания сводных таблиц — с помощью старого доброго метода pivot_table. Как и у большинства методов Python, его синтаксис прост и удобен для чтения.

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

Как создавать интерактивные сводные таблицы данных в Python

Самая интересная особенность этого подхода заключается в возможности сохранить полученный ноутбук с интерактивными компонентами визуализации данных в HTML и отправить его партнерам по команде. Они смогут открыть его в браузере, поэкспериментировать со сводной таблицей и диаграммами, сделать собственные наблюдения, сохранить отчет и отправить его обратно. Такой подход может значительно повысить продуктивность анализа данных в целом.

Мы будем работать в JupyterLab — пользовательском интерфейсе для Jupyter Notebooks, в котором можно найти все элементы классического Jupyter, такие как ноутбуки и файловый браузер. Помимо этого, JupyterLab предлагает более расширенную функциональность: возможность устанавливать расширения, разворачивать, сворачивать и перетаскивать ячейки, а также предоставляет функцию автозаполнения вкладок.

Создание отчета в JupyterLab

Запускаем JupyterLab. Для начала импортируем необходимые библиотеки Python: pandas, JSON и модуль display из IPython. Во всех этих библиотеках встроен дистрибутив Anaconda, однако, если вы не работаете с ним, то установите эти библиотеки глобально или в виртуальной среде.

    — неотъемлемый инструмент для работы со структурами данных в Python. — API для интерактивных и параллельных вычислений в Python. display — это его модуль, представляющий собой API для инструментов отображения в IPython.
  • Библиотека json предоставляет API для кодирования и декодирования JSON. Если вы уже работали с модулями marshal или pickle , то знакомы с этим API.

Для визуализации данных мы будем использовать библиотеку JavaScript Flexmonster Pivot Table & Charts.

Для демонстрации воспользуемся набором данных “Цены на авокадо” из Kaggle. Это легкий набор, содержащий разумное количество полей. Вы можете выбрать любой понравившийся вам набор данных.

Загрузите данные. С помощью pandas прочитайте данные CSV на фрейме данных. Удалите “Unnamed: 0” — столбец индекса, который часто появляется при чтении файлов CSV.

▶ Вызовите метод to_json() на фрейме данных, чтобы преобразовать его в строку JSON и сохранить в переменную json_data .

Параметр orient определяет ожидаемый формат строки JSON. Устанавливаем его в значение records. Это значение переводит объект в структуру, подобную списку: [, … , ]. Именно с этим форматом работает Flexmonster.

▶ Теперь создадим экземпляр Flexmonster с помощью вложенного словаря. Здесь нужно указать все необходимые параметры инициализации и передать декодированные данные компоненту. Для декодирования JSON воспользуемся методом json.loads() .

Как видите, мы сразу устанавливаем срез, опции и форматы. Если пропустить этот шаг, то в сводной таблице отобразится срез по умолчанию.

▶ Теперь преобразуем объект Python в JSON с помощью json.dumps() :

▶ Следующий шаг — определение функции, которая отображает сводную таблицу непосредственно в ячейку. Для этого определяем многострочную строку и передаем ее в импортированную функцию HTML:

▶ И, наконец, передаем JSON в функцию рендеринга и вызываем ее:

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

Сводная таблица выглядит следующим образом:

Вы также можете применить условное форматирование, чтобы сосредоточиться на самых важных значениях.

Создание панели индикаторов в Jupyter Notebook

Теперь немного усложним логику, добавив больше элементов в ноутбук. Две сводные диаграммы сделают визуализацию данных более универсальной. Для этого определяем дополнительную функцию, которая принимает несколько компонентов JSON и отображает их на странице. Ее логика выглядит так же, как и логика одной сводной таблицы. Компоненты сводных диаграмм определяются так же, как компоненты сводных таблиц.

В срезах отчетов для сводных диаграмм можно установить фильтры Top X для ограничения количества категорий, отображаемых в диаграммах, чтобы сделать их более аккуратными и компактными.

Интерактивная панель индикаторов в Jupyter Notebook готова к работе!

Заключение

Мы рассмотрели новый способ манипулирования и представления данных в Jupyter Notebook с помощью Python и библиотеки визуализации данных JavaScript. Как вы могли заметить, настройка не требует много кода и времени.

Выполнив ее однажды, вы сможете исследовать данные в привычном рабочем пространстве.

Этот подход освобождает вас от переписывания фрагментов кода при каждой необходимости взглянуть на данные под новым углом, а также прекрасно сочетается с главной идеей Jupyter Notebooks — сделать визуализацию и анализ данных интерактивными и гибкими.

Полную версию кода можно найти на GitHub. ��

Расширенные опции

Краткий список основных функций, с помощью которых можно улучшить отчеты:

  • Отображение

В большинстве случаев реальные данные неаккуратны и непоследовательны: поля могут быть названы с использованием разных случаев, непонятных сокращений и т. д. Для уточнения можно воспользоваться отображением (mapping) — свойством отчета, которое устанавливает конфигурации представлений, применяемых к источнику данных. Еще одним преимуществом этой функциональности форматирования является явная настройка типов данных. С ее помощью можно указать компоненту способ обработки полей, что повлияет на выбор агрегатов, доступных для иерархий полей.

В примере GitHub показано, как определить объект mapping и установить его в сводную таблицу.

  • Экспорт

Сводная таблица содержит методы и события JavaScript API. Вы можете настроить сохранение отчетов в различных форматах локально или в удаленных точках, таких как серверы, с помощью метода exportTo .

Анализ данных и визуализация с помощью панд и Jupyter Notebook в Python 3

Пакет Python pandas используется для обработки и анализа данных, он разработан, чтобы позволить вам работать с помеченными или реляционными данными интуитивно понятным способом.

Пакет pandas предлагает функции электронных таблиц, но, поскольку вы работаете с Python, он намного быстрее и эффективнее, чем традиционная программа для работы с электронными таблицами.

В этом руководстве мы рассмотрим настройку большого набора данных для работы с функциями groupby() и pivot_table() для pandas и, наконец, как визуализировать данные.

Чтобы получить некоторое представление о пакете pandas , вы можете прочитать наше руководствоAn Introduction to the pandas Package and its Data Structures in Python 3.

Предпосылки

Это руководство расскажет, как работать с данными в pandas на локальном рабочем столе или на удаленном сервере. Работа с большими наборами данных может потребовать много памяти, поэтому в любом случае компьютеру потребуется не менее2GB of memory для выполнения некоторых вычислений в этом руководстве.

В этом руководстве мы будем использоватьJupyter Notebook для работы с данными. Если у вас его еще нет, следуйте нашимtutorial to install and set up Jupyter Notebook for Python 3.

Настройка данных

В этом руководстве мы будем работать с данными социального обеспечения США об именах детей, которые доступны изSocial Security website в виде zip-файла размером 8 МБ.

Давайте активируем нашу среду программирования Python 3 на нашемlocal machine или на нашемserver из правильного каталога:

Теперь давайте создадим новый каталог для нашего проекта. Мы можем назвать его names , а затем перейти в каталог:

В этом каталоге мы можем извлечь zip-файл с веб-сайта Социального обеспечения с помощью команды curl :

Как только файл будет загружен, давайте проверим, что у нас установлены все пакеты, которые мы будем использовать:

numpy для поддержки многомерных массивов

matplotlib для визуализации данных

pandas для нашего анализа данных

seaborn , чтобы сделать статистическую графику matplotlib более эстетичной

Если у вас еще нет установленных пакетов, установите их с помощью pip , как в:

Пакет numpy также будет установлен, если у вас его еще нет.

Теперь мы можем запустить Jupyter Notebook:

Когда вы войдете в веб-интерфейс Jupyter Notebook, вы увидите там файл names.zip .

Чтобы создать новый файл записной книжки, выберитеNew>Python 3 в правом верхнем раскрывающемся меню:

Create a new Python 3 notebook

Это откроет блокнот.

Начнем сimporting пакетов, которые мы будем использовать. В верхней части нашей записной книжки мы должны написать следующее:

Мы можем запустить этот код и перейти к новому блоку кода, набрав ALT + ENTER .

Давайте также скажем Python Notebook, чтобы наши графики были встроенными:

Давайте запустим код и продолжим, набрав ALT + ENTER .

С этого момента мы перейдем к распаковке zip-архива, загрузим набор данных CSV в pandas , а затем объединим pandas DataFrames.

Распаковка Zip-архива

Чтобы распаковать zip-архив в текущий каталог, мы импортируем модуль zipfile , а затем вызовем функцию ZipFile с именем файла (в нашем случае names.zip ):

Мы можем запустить код и продолжить, набрав ALT + ENTER .

Теперь, если вы вернетесь в свой каталог names , у вас будут файлы данных имен .txt в формате CSV. Эти файлы будут соответствовать годам данных в файле, с 1881 по 2015 год. Каждый из этих файлов соответствует похожему соглашению об именах. Например, файл 2015 года называется yob2015.txt , а файл 1927 года — yob1927.txt .

Чтобы взглянуть на формат одного из этих файлов, давайте используем Python, чтобы открыть его и отобразить 5 верхних строк:

Запустите код и продолжайте с ALT + ENTER .

Форматирование данных: сначала имя (как в Emma или Olivia ), затем пол (как в F для женского имени и M для мужского имени), а затем количество младенцев, родившихся в этом году с этим именем (в 2015 году родилось 20 355 младенцев по имени Эмма).

Имея эту информацию, мы можем загрузить данные в pandas .

Загрузить данные CSV в pandas

Чтобы загрузить данные значений, разделенных запятыми, в pandas , мы будем использовать функцию pd.read_csv() , передавая имя текстового файла, а также имена столбцов, которые мы выберем. Мы присвоим это переменной, в данном случае names2015 , поскольку мы используем данные из файла за 2015 год рождения.

Введите ALT + ENTER , чтобы запустить код и продолжить.

Чтобы убедиться, что это сработало, давайте отобразим верхнюю часть таблицы:

Когда мы запустим код и продолжим с ALT + ENTER , мы увидим следующий результат:

names2015.head output

Наша таблица теперь содержит информацию об именах, поле и количестве детей, рожденных с каждым именем, упорядоченным по столбцам.

Объединить объекты pandas

Объединение объектов pandas позволит нам работать со всеми отдельными текстовыми файлами в каталоге names .

Чтобы объединить их, нам сначала нужно инициализировать список, назначив переменную незаполненномуlist data type:

Как только мы это сделаем, мы будем использовать for loop для перебора всех файлов по годам, которые варьируются от 1880 до 2015. Мы добавим +1 к концу 2015 года, чтобы 2015 год был включен в цикл.

Внутри цикла мы добавим в список каждое из значений текстового файла, используяstring formatter для обработки различных имен каждого из этих файлов. Мы передадим эти значения переменной year . Опять же, мы укажем столбцы для Name , Sex и количества Babies :

Кроме того, мы создадим столбец для каждого года, чтобы сохранить упорядоченность. Это можно сделать после каждой итерации, используя индекс -1 , чтобы указывать на них по ходу цикла.

Наконец, мы добавим его к объекту pandas конкатенацией с помощью функции pd.concat() . Мы будем использовать переменную all_names для хранения этой информации.

Теперь мы можем запустить цикл с ALT + ENTER , а затем проверить вывод, вызвав хвост (самые нижние строки) результирующей таблицы:

all_names.tail outputl

Теперь наш набор данных готов и готов к дополнительной работе с ним в pandas .

Группировка данных

С помощью pandas вы можете группировать данные по столбцам с помощью функции .groupby() . Используя нашу переменную all_names для нашего полного набора данных, мы можем использовать groupby() для разделения данных на разные сегменты.

Давайте сгруппируем набор данных по полу и году. Мы можем настроить это так:

Мы можем запустить код и продолжить с ALT + ENTER .

На этом этапе, если мы просто вызовем переменную group_name , мы получим следующий результат:

Это показывает нам, что это объект DataFrameGroupBy . Этот объект содержит инструкции о том, как группировать данные, но не дает инструкций о том, как отображать значения.

Для отображения значений нам нужно будет дать инструкции. Мы можем вычислить .size() , .mean() и .sum() , например, чтобы вернуть таблицу.

Когда мы запустим код и продолжим с ALT + ENTER , наш результат будет выглядеть так:

Эти данные выглядят хорошо, но они могут быть более читабельными. Мы можем сделать его более читабельным, добавив функцию .unstack :

Теперь, когда мы запускаем код и продолжаем вводить ALT + ENTER , результат будет выглядеть следующим образом:

group_name.size().unstack() output

Эти данные говорят нам о том, сколько женских и мужских имен было за каждый год. Например, в 1889 году было 1479 женских и 1111 мужских имен. В 2015 году насчитывалось 18 993 женских и 13 959 мужских имен. Это показывает, что с течением времени происходит большее разнообразие имен.

Если мы хотим получить общее количество рожденных младенцев, мы можем использовать функцию .sum() . Давайте применим это к меньшему набору данных, names2015 , установленному из единственного файла yob2015.txt , который мы создали ранее:

Давайте наберем ALT + ENTER , чтобы запустить код и продолжить:

names2015.groupby([) .sum () output]

Это показывает нам общее количество младенцев мужского и женского пола, родившихся в 2015 году, хотя в набор данных включаются только те дети, чье имя использовалось не менее 5 раз в этом году.

Функция pandas .groupby() позволяет нам сегментировать наши данные на значимые группы.

Сводная таблица

Сводные таблицы полезны для обобщения данных. Они могут автоматически сортировать, подсчитывать, суммировать или усреднять данные, хранящиеся в одной таблице. Затем они могут показать результаты этих действий в новой таблице этих обобщенных данных.

В pandas функция pivot_table() используется для создания сводных таблиц.

Чтобы построить сводную таблицу, мы сначала вызовем DataFrame, с которым мы хотим работать, затем данные, которые мы хотим показать, и то, как они сгруппированы.

В этом примере мы будем работать с данными all_names и покажем данные о младенцах, сгруппированные по имени в одном измерении и году — в другом:

Когда мы набираем ALT + ENTER , чтобы запустить код и продолжить, мы увидим следующий результат:

pd.pivot_table(all_names

Поскольку это показывает много пустых значений, мы можем захотеть сохранить Имя и Год как столбцы, а не как строки в одном случае и столбцы в другом. Мы можем сделать это, сгруппировав данные в квадратных скобках:

После того, как мы введем ALT + ENTER , чтобы запустить код и продолжить, в этой таблице теперь будут отображаться данные только за те годы, которые зарегистрированы для каждого имени:

Кроме того, мы можем сгруппировать данные так, чтобы имя и пол были в одном измерении, а год — в другом:

Когда мы запустим код и продолжим с ALT + ENTER , мы увидим следующую таблицу:

pd.pivot_table(all_names

, ‘Year’) output]

Сводные таблицы позволяют нам создавать новые таблицы из существующих таблиц, что позволяет нам решать, как мы хотим, чтобы эти данные группировались.

Визуализируйте данные

Используя pandas с другими пакетами, такими как matplotlib , мы можем визуализировать данные в нашей записной книжке.

Мы будем визуализировать данные о популярности данного имени на протяжении многих лет. Для этого нам нужно установить и отсортировать индексы для обработки данных, которые позволят нам увидеть изменение популярности конкретного имени.

Пакет pandas позволяет нам выполнять иерархическое или многоуровневое индексирование, которое позволяет нам хранить и манипулировать данными с произвольным количеством измерений.

Мы собираемся проиндексировать наши данные с информацией о пол, затем имя, год. Мы также хотим отсортировать индекс:

Введите ALT + ENTER для запуска и перейдите к следующей строке, где в записной книжке будет отображаться новый проиндексированный фрейм данных:

Запустите код и продолжайте с ALT + ENTER , и результат будет выглядеть так:

all_names_index output

Далее мы хотим написать функцию, которая будет отображать популярность имени с течением времени. Мы вызовем функцию name_plot и передадим ей sex и name в качестве параметров, которые мы будем вызывать при запуске функции.

Теперь мы настроим переменную с именем data для хранения созданной таблицы. Мы также будем использовать pandas DataFrame loc , чтобы выбирать нашу строку по значению индекса. В нашем случае мы хотим, чтобы loc основывался на комбинации полей в MultiIndex, ссылаясь как на данные sex , так и на name .

Давайте запишем эту конструкцию в нашу функцию:

Наконец, нам нужно отобразить значения с matplotlib.pyplot , которые мы импортировали как pp . Затем мы сопоставим значения данных пола и имени с индексом, который для наших целей равен годам.

Введите ALT + ENTER , чтобы запустить и перейти в следующую ячейку. Теперь мы можем вызвать функцию с указанием пола и имени по нашему выбору, например F для женского имени с заданным именем Danica .

Когда вы сейчас наберете ALT + ENTER , вы получите следующий результат:

Danica Name Plot output

Обратите внимание, что в зависимости от того, какую систему вы используете, вы можете получить предупреждение о замене шрифта, но данные все равно будут отображаться правильно.

Глядя на визуализацию, мы видим, что женское имя Даника немного выросло в 1990 году и достигло максимума как раз перед 2010 годом.

Созданную нами функцию можно использовать для отображения данных из нескольких имен, чтобы мы могли видеть тенденции во времени для разных имен.

Давайте начнем с того, что сделаем наш сюжет немного больше:

Далее, давайте создадим список со всеми именами, которые мы хотели бы построить:

Теперь мы можем перебирать список с помощью цикла for и отображать данные для каждого имени. Во-первых, мы попробуем эти гендерно-нейтральные имена как женские имена:

Чтобы облегчить понимание этих данных, давайте добавим легенду:

Мы наберем ALT + ENTER , чтобы запустить код и продолжить, а затем мы получим следующий результат:

Name plot

В то время как каждое из имен постепенно завоевывало популярность как женские имена, имя, которое Джейми был чрезвычайно популярен как женское имя в 1980 году.

Давайте назовем те же имена, но на этот раз как мужские имена:

Снова введите ALT + ENTER , чтобы запустить код и продолжить. График будет выглядеть так:

Name plot

Эти данные показывают большую популярность среди имен, причем Джесси, как правило, является самым популярным выбором и особенно популярным в 1980-х и 1990-х годах.

Отсюда вы можете продолжать играть с данными имен, создавать визуализации различных имен и их популярности, а также создавать другие сценарии для просмотра различных данных для визуализации.

Заключение

В этом руководстве вы познакомились со способами работы с большими наборами данных от настройки данных до группировки данных с помощью groupby() и pivot_table() , индексации данных с помощью MultiIndex и визуализации данных pandas . используя пакет matplotlib .

Многие организации и учреждения предоставляют наборы данных, с которыми вы можете работать, чтобы продолжать изучать pandas и визуализацию данных. Правительство США предоставляет данные, например, черезdata.gov.

Вы можете узнать больше о визуализации данных с помощью matplotlib , следуя нашим руководствам поHow to Plot Data in Python 3 Using matplotlib иHow To Graph Word Frequency Using matplotlib with Python 3.

Моя шпаргалка по pandas

Один преподаватель как-то сказал мне, что если поискать аналог программиста в мире книг, то окажется, что программисты похожи не на учебники, а на оглавления учебников: они не помнят всего, но знают, как быстро найти то, что им нужно.

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

Нельзя сказать, что это — исчерпывающий список возможностей pandas , но сюда входят функции, которыми я пользуюсь чаще всего, примеры и мои пояснения по поводу ситуаций, в которых эти функции особенно полезны.

1. Подготовка к работе

Если вы хотите самостоятельно опробовать то, о чём тут пойдёт речь, загрузите набор данных Anime Recommendations Database с Kaggle. Распакуйте его и поместите в ту же папку, где находится ваш Jupyter Notebook (далее — блокнот).

Теперь выполните следующие команды.

После этого у вас должна появиться возможность воспроизвести то, что я покажу в следующих разделах этого материала.

2. Импорт данных

▍Загрузка CSV-данных

Здесь я хочу рассказать о преобразовании CSV-данных непосредственно в датафреймы (в объекты Dataframe). Иногда при загрузке данных формата CSV нужно указывать их кодировку (например, это может выглядеть как encoding=’ISO-8859–1′ ). Это — первое, что стоит попробовать сделать в том случае, если оказывается, что после загрузки данных датафрейм содержит нечитаемые символы.

Загруженные CSV-данные

Существует похожая функция для загрузки данных из Excel-файлов — pd.read_excel .

▍Создание датафрейма из данных, введённых вручную

Это может пригодиться тогда, когда нужно вручную ввести в программу простые данные. Например — если нужно оценить изменения, претерпеваемые данными, проходящими через конвейер обработки данных.

Данные, введённые вручную

▍Копирование датафрейма

Копирование датафреймов может пригодиться в ситуациях, когда требуется внести в данные изменения, но при этом надо и сохранить оригинал. Если датафреймы нужно копировать, то рекомендуется делать это сразу после их загрузки.

Копия датафрейма

3. Экспорт данных

▍Экспорт в формат CSV

При экспорте данных они сохраняются в той же папке, где находится блокнот. Ниже показан пример сохранения первых 10 строк датафрейма, но то, что именно сохранять, зависит от конкретной задачи.

Экспортировать данные в виде Excel-файлов можно с помощью функции df.to_excel .

4. Просмотр и исследование данных

▍Получение n записей из начала или конца датафрейма

Сначала поговорим о выводе первых n элементов датафрейма. Я часто вывожу некоторое количество элементов из начала датафрейма где-нибудь в блокноте. Это позволяет мне удобно обращаться к этим данным в том случае, если я забуду о том, что именно находится в датафрейме. Похожую роль играет и вывод нескольких последних элементов.

Данные из начала датафрейма

Данные из конца датафрейма

▍Подсчёт количества строк в датафрейме

Функция len(), которую я тут покажу, не входит в состав pandas . Но она хорошо подходит для подсчёта количества строк датафреймов. Результаты её работы можно сохранить в переменной и воспользоваться ими там, где они нужны.

▍Подсчёт количества уникальных значений в столбце

Для подсчёта количества уникальных значений в столбце можно воспользоваться такой конструкцией:

▍Получение сведений о датафрейме

В сведения о датафрейме входит общая информация о нём вроде заголовка, количества значений, типов данных столбцов.

Сведения о датафрейме

Есть ещё одна функция, похожая на df.info — df.dtypes . Она лишь выводит сведения о типах данных столбцов.

▍Вывод статистических сведений о датафрейме

Знание статистических сведений о датафрейме весьма полезно в ситуациях, когда он содержит множество числовых значений. Например, знание среднего, минимального и максимального значений столбца rating даёт нам некоторое понимание того, как, в целом, выглядит датафрейм. Вот соответствующая команда:

Статистические сведения о датафрейме

▍Подсчёт количества значений

Для того чтобы подсчитать количество значений в конкретном столбце, можно воспользоваться следующей конструкцией:

Подсчёт количества элементов в столбце

5. Извлечение информации из датафреймов

▍Создание списка или объекта Series на основе значений столбца

Это может пригодиться в тех случаях, когда требуется извлекать значения столбцов в переменные x и y для обучения модели. Здесь применимы следующие команды:

Результаты работы команды anime[‘genre’].tolist()

Результаты работы команды anime[‘genre’]

▍Получение списка значений из индекса

Поговорим о получении списков значений из индекса. Обратите внимание на то, что я здесь использовал датафрейм anime_modified , так как его индексные значения выглядят интереснее.

Результаты выполнения команды

▍Получение списка значений столбцов

Вот команда, которая позволяет получить список значений столбцов:

Результаты выполнения команды

6. Добавление данных в датафрейм и удаление их из него

▍Присоединение к датафрейму нового столбца с заданным значением

Иногда мне приходится добавлять в датафреймы новые столбцы. Например — в случаях, когда у меня есть тестовый и обучающий наборы в двух разных датафреймах, и мне, прежде чем их скомбинировать, нужно пометить их так, чтобы потом их можно было бы различить. Для этого используется такая конструкция:

▍Создание нового датафрейма из подмножества столбцов

Это может пригодиться в том случае, если требуется сохранить в новом датафрейме несколько столбцов огромного датафрейма, но при этом не хочется выписывать имена столбцов, которые нужно удалить.

Результат выполнения команды

▍Удаление заданных столбцов

Этот приём может оказаться полезным в том случае, если из датафрейма нужно удалить лишь несколько столбцов. Если удалять нужно много столбцов, то эта задача может оказаться довольно-таки утомительной, поэтому тут я предпочитаю пользоваться возможностью, описанной в предыдущем разделе.

Результаты выполнения команды

▍Добавление в датафрейм строки с суммой значений из других строк

Для демонстрации этого примера самостоятельно создадим небольшой датафрейм, с которым удобно работать. Самое интересное здесь — это конструкция df.sum(axis=0) , которая позволяет получать суммы значений из различных строк.

Результат выполнения команды

Команда вида df.sum(axis=1) позволяет суммировать значения в столбцах.

Похожий механизм применим и для расчёта средних значений. Например — df.mean(axis=0) .

7. Комбинирование датафреймов

▍Конкатенация двух датафреймов

Эта методика применима в ситуациях, когда имеются два датафрейма с одинаковыми столбцами, которые нужно скомбинировать.

В данном примере мы сначала разделяем датафрейм на две части, а потом снова объединяем эти части:

Датафрейм df1

Датафрейм df2

Датафрейм, объединяющий df1 и df2

▍Слияние датафреймов

Функция df.merge , которую мы тут рассмотрим, похожа на левое соединение SQL. Она применяется тогда, когда два датафрейма нужно объединить по некоему столбцу.

Результаты выполнения команды

8. Фильтрация

▍Получение строк с нужными индексными значениями

Индексными значениями датафрейма anime_modified являются названия аниме. Обратите внимание на то, как мы используем эти названия для выбора конкретных столбцов.

Результаты выполнения команды

▍Получение строк по числовым индексам

Эта методика отличается от той, которая описана в предыдущем разделе. При использовании функции df.iloc первой строке назначается индекс 0 , второй — индекс 1 , и так далее. Такие индексы назначаются строкам даже в том случае, если датафрейм был модифицирован и в его индексном столбце используются строковые значения.

Следующая конструкция позволяет выбрать три первых строки датафрейма:

Результаты выполнения команды

▍Получение строк по заданным значениям столбцов

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

Результаты выполнения команды

Если нас интересует единственное значение — можно воспользоваться такой конструкцией:

▍Получение среза датафрейма

Эта техника напоминает получение среза списка. А именно, речь идёт о получении фрагмента датафрейма, содержащего строки, соответствующие заданной конфигурации индексов.

Результаты выполнения команды

▍Фильтрация по значению

Из датафреймов можно выбирать строки, соответствующие заданному условию. Обратите внимание на то, что при использовании этого метода сохраняются существующие индексные значения.

Результаты выполнения команды

9. Сортировка

Для сортировки датафреймов по значениям столбцов можно воспользоваться функцией df.sort_values :

Результаты выполнения команды

10. Агрегирование

▍Функция df.groupby и подсчёт количества записей

Вот как подсчитать количество записей с различными значениями в столбцах:

Результаты выполнения команды

▍Функция df.groupby и агрегирование столбцов различными способами

Обратите внимание на то, что здесь используется reset_index() . В противном случае столбец type становится индексным столбцом. В большинстве случаев я рекомендую делать то же самое.

▍Создание сводной таблицы

Для того чтобы извлечь из датафрейма некие данные, нет ничего лучше, чем сводная таблица. Обратите внимание на то, что здесь я серьёзно отфильтровал датафрейм, что ускорило создание сводной таблицы.

Результаты выполнения команды

11. Очистка данных

▍Запись в ячейки, содержащие значение NaN, какого-то другого значения

Здесь мы поговорим о записи значения 0 в ячейки, содержащие значение NaN . В этом примере мы создаём такую же сводную таблицу, как и ранее, но без использования fill_value=0 . А затем используем функцию fillna(0) для замены значений NaN на 0 .

Таблица, содержащая значения NaN

Результаты замены значений NaN на 0

12. Другие полезные возможности

▍Отбор случайных образцов из набора данных

Я использую функцию df.sample каждый раз, когда мне нужно получить небольшой случайный набор строк из большого датафрейма. Если используется параметр frac=1 , то функция позволяет получить аналог исходного датафрейма, строки которого будут перемешаны.

Результаты выполнения команды

▍Перебор строк датафрейма

Следующая конструкция позволяет перебирать строки датафрейма:

Результаты выполнения команды

▍Борьба с ошибкой IOPub data rate exceeded

Если вы сталкиваетесь с ошибкой IOPub data rate exceeded — попробуйте, при запуске Jupyter Notebook, воспользоваться следующей командой:

Итоги

Здесь я рассказал о некоторых полезных приёмах использования pandas в среде Jupyter Notebook. Надеюсь, моя шпаргалка вам пригодится.

Уважаемые читатели! Есть ли какие-нибудь возможности pandas , без которых вы не представляете своей повседневной работы?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *