Руководство: Pandas DataFrames для анализа данных

Оглавление

"Data scientist" - одна из самых горячих вакансий в технологиях, а Python - лингва-франка науки о данных. Благодаря легкому в освоении синтаксису, открытой экосистеме и сильному сообществу Python стал одним из самых быстроразвивающихся языков в последние годы.

В этой заметке мы познакомимся с Pandas, высокопроизводительным пакетом с открытым исходным кодом для проведения анализа данных на Python.

Мы рассмотрим:

  • Что такое Pandas и зачем его использовать.
  • Что такое фрейм данных Pandas.
  • Создание и просмотр DataFrame.
  • Манипулирование данными в DataFrame.

Давайте начнем.

Что такое Pandas и почему я должен ее использовать?

Pandas - это библиотека с открытым исходным кодом для выполнения анализа данных на языке Python. Она была создана Уэсом Маккинни во время его работы в инвестиционной компании AQR Capital. Уэс и AQR Capital выложили проект в открытый доступ, и его популярность в сообществе Python резко возросла.

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

В качестве примера представим, что у вас есть большой двумерный набор данных, сравнимый с электронной таблицей Excel. Ваш набор данных имеет множество столбцов и строк.

Вы бы использовали Pandas для

  • Установка значений по умолчанию для строк с отсутствующими значениями.
  • Объединение (или "join", на языке SQL) двух отдельных наборов данных.
  • Фильтрация набора данных на основе значений в определенном столбце.
  • Просмотр сводной статистики, такой как среднее значение, стандартное отклонение и перцентили.

Эти операции помогут вам сэкономить массу времени и перейти к важной работе - поиску ценностей из ваших данных.

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

Что такое Pandas DataFrame?

Основной структурой данных в Pandas является DataFrame. DataFrame - это двумерная структура данных, состоящая из столбцов и строк

Если вы знакомы с статистическим языком программирования R, то DataFrame создан по образцу объекта data.frame в R.

Структура Pandas DataFrame обеспечивает скорость низкоуровневых языков в сочетании с простотой и выразительностью языков высокого уровня.

Каждая строка в DataFrame представляет собой отдельную запись - вспомните пользователя SaaS-приложения или сводку биржевых сделок за один день по определенному символу акции.

Каждый столбец в DataFrame представляет наблюдаемое значение для каждой строки DataFrame. DataFrames может иметь несколько столбцов, каждый из которых имеет определенный тип.

Например, если у вас есть DataFrame, содержащий ежедневные сводки сделок по символу акции, вы можете иметь один столбец типа float, указывающий цену закрытия, и другой столбец типа int, указывающий общий объем торгов в этот день.

DataFrames построены на базе NumPy, молниеносной библиотеки, использующей C/C++ и Fortran для быстрых и эффективных вычислений данных.

Теперь, когда мы поняли основы DataFrame, давайте поиграем с созданием и просмотром DataFrame.

Создание и просмотр фрейма данных Pandas DataFrame

В этом разделе мы создадим и просмотрим Pandas DataFrame. Для изучения основных операций Pandas мы будем использовать некоторые сводные данные по акциям.

Установка Pandas может быть затруднена из-за ее зависимости от библиотек для численных вычислений, таких как NumPy, которые включают средства интеграции с Фортраном и другими низкоуровневыми языками.

Если вы не являетесь специалистом по Python, то самый простой способ начать работу с Pandas - установить дистрибутив Anaconda Python. Ознакомьтесь с документацией по установке Pandas, чтобы узнать обо всех возможностях.

Сначала создадим Pandas DataFrame. Существует множество способов создания DataFrame - из одного словаря Python, из списка словарей, из списка списков и многие другие.

Одним из наиболее распространенных способов создания DataFrame является создание его из CSV-файла с помощью функции read_csv(). Pandas даже упрощает чтение CSV через HTTP, позволяя передавать URL в функцию read_csv().

Давайте сделаем это здесь. Мы воспользуемся этим URL, который содержит собранный мной CSV. Он содержит сводные данные по трем акциям (AAPL, MSFT и AMZN) за пять торговых дней.

>>> import pandas as pd
>>> url = 'https://gist.githubusercontent.com/alexdebrie/b3f40efc3dd7664df5a20f5eee85e854/raw/ee3e6feccba2464cbbc2e185fb17961c53d2a7f5/stocks.csv'
>>> df = pd.read_csv(url)
>>> type(df)
< class 'pandas.core.frame.DataFrame'>
>>> print(df)
          date symbol     open     high      low    close    volume
0   2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73   4974877
1   2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17   6167358
2   2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43   3681522
3   2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95   3996001
4   2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95   4957017
5   2019-03-01   AAPL   174.28   175.15   172.89   174.97  25886167
6   2019-03-04   AAPL   175.69   177.75   173.97   175.85  27436203
7   2019-03-05   AAPL   175.94   176.00   174.54   175.53  19737419
8   2019-03-06   AAPL   174.67   175.49   173.94   174.52  20810384
9   2019-03-07   AAPL   173.87   174.44   172.02   172.50  24796374
10  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99   1450316
11  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80   1446047
12  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03   1443174
13  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86   1099289
14  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30   1166559

В приведенном примере мы импортировали Pandas и присвоили ему псевдоним pd, как это обычно бывает при работе с Pandas. Затем мы использовали функцию read_csv() для создания DataFrame из нашего CSV-файла. Видно, что возвращаемый объект имеет тип pandas.core.frame.DataFrame. Далее, при печати объекта мы видим весь DataFrame.

Просмотр фрейма данных с головой и хвостом

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

Для печати нескольких строк можно использовать методы shead() и tail() на объекте DataFrame.

>>> df.head()
         date symbol     open     high      low    close   volume
0  2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73  4974877
1  2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17  6167358
2  2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43  3681522
3  2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95  3996001
4  2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95  4957017
>>> df.tail()
          date symbol     open     high      low    close   volume
10  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99  1450316
11  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80  1446047
12  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03  1443174
13  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86  1099289
14  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30  1166559

head() выведет несколько первых строк вашего DataFrame, а tail() - несколько последних строк.

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

Understanding Your DataFrame With Info and Describe

Помимо просмотра нескольких примеров строк, вы можете захотеть получить представление о DataFrame в целом. Здесь Pandas также имеет несколько полезных методов.

Метод info() предоставит информацию о структуре DataFrame, включая количество строк в DataFrame, имена и типы столбцов, а также объем используемой памяти для DataFrame.

>>> df.info()
< class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 7 columns):
date      15 non-null object
symbol    15 non-null object
open      15 non-null float64
high      15 non-null float64
low       15 non-null float64
close     15 non-null float64
volume    15 non-null int64
dtypes: float64(4), int64(1), object(2)
memory usage: 920.0+ bytes

Метод describe() включает в себя сводную статистику для числовых столбцов, такую как среднее значение, стандартное отклонение и процентили:

>>> df.describe()
              open         high          low        close        volume
count    15.000000    15.000000    15.000000    15.000000  1.500000e+01
mean   1001.402000  1008.867333   990.836667   998.705333  9.936580e+06
std     645.683362   650.102605   637.842739   642.198730  1.036832e+07
min     173.870000   174.440000   172.020000   172.500000  1.099289e+06
25%     175.815000   176.875000   174.255000   175.690000  1.448182e+06
50%    1150.060000  1158.280000  1134.910000  1147.800000  4.957017e+06
75%    1661.250000  1672.005000  1635.755000  1647.450000  2.027390e+07
max    1702.950000  1709.430000  1689.010000  1696.170000  2.743620e+07

Эти методы могут сэкономить вам много времени по мере ознакомления с вашими данными.

Манипулирование данными в DataFrame

Теперь давайте научимся манипулировать данными в нашем DataFrame. Pandas позволяет легко очистить и разложить данные перед проведением машинного обучения или других анализов.

В этом разделе мы продолжим использовать наш DataFrame из предыдущего раздела. Мы увидим, как выбрать определенные строки, как выбрать определенные столбцы и как добавить новый столбец.

Выбор строк в DataFrame

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

Мы можем использовать метод loc() для передачи оператора равенства, который фильтрует строки, в которых символ равен AMZN. В результате будут возвращены все торговые данные по компании Amazon.

>>> df.loc[df['symbol'] == 'AMZN']
         date symbol     open     high      low    close   volume
0  2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73  4974877
1  2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17  6167358
2  2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43  3681522
3  2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95  3996001
4  2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95  4957017

В методе loc() можно указать несколько операторов равенства. В приведенном ниже коде мы выбираем все строки, в которых символом является AMZN и акция открылась по цене более 1690.

>>> df.loc[(df['symbol'] == 'AMZN') & (df['open'] > 1690)]
         date symbol     open     high      low    close   volume
2  2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43  3681522
3  2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95  3996001

Выбор столбцов в DataFrame

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

>>> df.open
0     1655.13
1     1685.00
2     1702.95
3     1695.97
4     1667.37
5      174.28
6      175.69
7      175.94
8      174.67
9      173.87
10    1124.90
11    1146.99
12    1150.06
13    1162.49
14    1155.72
Name: open, dtype: float64

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

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

>>> df[['date', 'symbol', 'open']]
          date symbol     open
0   2019-03-01   AMZN  1655.13
1   2019-03-04   AMZN  1685.00
2   2019-03-05   AMZN  1702.95
3   2019-03-06   AMZN  1695.97
4   2019-03-07   AMZN  1667.37
5   2019-03-01   AAPL   174.28
6   2019-03-04   AAPL   175.69
7   2019-03-05   AAPL   175.94
8   2019-03-06   AAPL   174.67
9   2019-03-07   AAPL   173.87
10  2019-03-01   GOOG  1124.90
11  2019-03-04   GOOG  1146.99
12  2019-03-05   GOOG  1150.06
13  2019-03-06   GOOG  1162.49
14  2019-03-07   GOOG  1155.72

Вот и все! Мы только что извлекли столбцы даты, символа и открытия для каждой строки.

Добавление нового столбца в Pandas DataFrame

Для последнего примера рассмотрим, как изменить наш DataFrame. Для этого мы добавим совершенно новый столбец.

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

14  2019-03-07   GOOG  1155.72
>>> df['change'] = df['close'] - df['open']
>>> df
          date symbol     open     high      low    close    volume  change
0   2019-03-01   AMZN  1655.13  1674.26  1651.00  1671.73   4974877   16.60
1   2019-03-04   AMZN  1685.00  1709.43  1674.36  1696.17   6167358   11.17
2   2019-03-05   AMZN  1702.95  1707.80  1689.01  1692.43   3681522  -10.52
3   2019-03-06   AMZN  1695.97  1697.75  1668.28  1668.95   3996001  -27.02
4   2019-03-07   AMZN  1667.37  1669.75  1620.51  1625.95   4957017  -41.42
5   2019-03-01   AAPL   174.28   175.15   172.89   174.97  25886167    0.69
6   2019-03-04   AAPL   175.69   177.75   173.97   175.85  27436203    0.16
7   2019-03-05   AAPL   175.94   176.00   174.54   175.53  19737419   -0.41
8   2019-03-06   AAPL   174.67   175.49   173.94   174.52  20810384   -0.15
9   2019-03-07   AAPL   173.87   174.44   172.02   172.50  24796374   -1.37
10  2019-03-01   GOOG  1124.90  1142.97  1124.75  1140.99   1450316   16.09
11  2019-03-04   GOOG  1146.99  1158.28  1130.69  1147.80   1446047    0.81
12  2019-03-05   GOOG  1150.06  1169.61  1146.19  1162.03   1443174   11.97
13  2019-03-06   GOOG  1162.49  1167.57  1155.49  1157.86   1099289   -4.63
14  2019-03-07   GOOG  1155.72  1156.76  1134.91  1143.30   1166559  -12.42

В приведенном примере мы создали новый столбец change, который показывает разницу между значениями open и close за день.

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

Заключение

В этой статье мы познакомились с основами Pandas, широко распространенной библиотеки анализа и манипулирования данными для Python.

После рассмотрения истории Pandas мы познакомились с DataFrame, основной структурой данных в Pandas. Мы увидели, как создать и просмотреть фрейм Pandas DataFrame, а также как манипулировать фреймом DataFrame для подготовки данных к дальнейшему использованию.

Вернуться на верх