Руководство: Pandas DataFrames для анализа данных
Оглавление
- Что такое Pandas и зачем его использовать?
- Что такое фрейм данных Pandas?
- Создание и просмотр фрейма данных Pandas
- Манипулирование данными в вашем фрейме данных
- Заключение
"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 для подготовки данных к дальнейшему использованию.
Вернуться на верх