Введение в анализ данных и библиотеку pandas в python 3

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

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

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

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

Установка Pandas

Как и другие пакеты Python,  вы можете установить pandas с помощью pip .

Для начала, давайте перейдет в нашу локальную среду программирования или серверную среду программирования  и установите pandas со всеми его зависимостями там:

(my_env) [email protected]:~/environments$ pip install pandas numpy python-dateutil pytz

Вы должны получить примерно это:

Output
Successfully installed pandas-0.19.2

Если вы предпочитаете устанавливать pandas в пределах Anaconda, то вы можете сделать это с помощью следующей команды:

(my_env) [email protected]:~/environments$ conda install pandas

На данный момент,  все готово, чтобы начать работать с пакетом pandas.

Series

В pandas, series -это проиндексированные одномерные массивы, которые могут содержать любой тип данных. Метки осей  именуются как индекс.

Давайте перейдем в  интерпретатор Python:

(my_env) [email protected]:~/environments$ python

Уже оттуда импортируйте пакеты Numpy и Pandas  в пространство имен:

>>> import numpy as np

>>> import pandas as pd

Перед тем как мы начнем работаем  с series, давайте взглянем на то, что он вообще из себя представляет:

s = pd.Series([data], index=[index])

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

Без объявления индекса

Мы будем вводить целые данные, а затем предоставлять имя параметра для нашего массива, но сначала, для того чтобы увидеть как pandas будет заполнять его неявно, мы не не будем объявлять индекс:

>>> s = pd.Series([0, 1, 4, 9, 16, 25], name=’Squares‘)

Теперь, давайте вызовем серию, чтобы посмотреть  что pandas сделала с ним:

>>> s

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

Output
0 0

1 1
2 4
3 9
4 16
5 25
Name: Squares, dtype: int64

Хоть мы и  не задавали индекс для массива, он был добавлен неявно из целочисленных значений 0 до 5.

Объявление индекса

Как вы уже поняли у series мы также можем объявить индекс.  Мы будем использовать данные о средней глубине океанов Земли(в метрах):

>>> avg_ocean_depth = pd.Series([1205, 3646, 3741, 4080, 3270], index=[‘Arctic’, ‘Atlantic’, ‘Indian’, ‘Pacific’, ‘Southern’])

Ну а теперь давайте посмотрим что у нас получилось(вызовем переменную):

>>> avg_ocean_depth

Output
Arctic 1205
Atlantic 3646
Indian 3741
Pacific 4080
Southern 3270
dtype: int64

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

Индексация и декомпозиция series

С помощью pandas мы можем  значения по его индексу(если мы его знаем конечно):

>>> avg_ocean_depth[2]

Мы также можем сделать срез(slice) по индексам и получить уже несколько значений:

>>> avg_ocean_depth[2:4]

Output
Indian 3741
Pacific 4080
dtype: int64

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

>>> avg_ocean_depth[‘Indian’]

Output
3741

И можно сделать срез по значениям индекса и вернуть соответствующие значения:

>>> avg_ocean_depth[‘Indian’:’Southern’]

Output
Indian 3741
Pacific 4080
Southern 3270
dtype: int64

Обратите внимание на то, что в этом последнем примере, срез с именами индекса два параметра включают, а не исключают.

Давайте выйдем из интерпретатора Python с quit() .

Создаем массив с помощью словаря

С pandas мы также можем использовать словарь для инициализации Series. В этом случае, нам не нужно объявлять индекс в виде отдельного списка. Давайте создадим файл с именем ocean.py и добавим следующий словарь с функцией print в конце, чтобы вывести результат:

ocean.py

import numpy as np
import pandas as pd
avg_ocean_depth = pd.Series({
‘Arctic’: 1205,
‘Atlantic’: 3646,
‘Indian’: 3741,
‘Pacific’: 4080,
‘Southern’: 3270
})
print(avg_ocean_depth)

Теперь мы можем запустить файл в командной строке:

(my_env) [email protected]:~/environments$ python ocean.py

Получим следующий вывод:

Output
Arctic 1205
Atlantic 3646
Indian 3741
Pacific 4080
Southern 3270
dtype: int64

Наш массив отображается в организованном порядке, с индексом (состоящий из наших ключей словаря) слева, и множеством значений справа.

Эта конструкция будет вести себя подобно словарю в python: мы можем получить доступ к значениям по ключу:

ocean_depth.py


print(avg_ocean_depth[‘Indian’])
print(avg_ocean_depth[‘Atlantic’:’Indian’])

Output
3741
Atlantic 3646
Indian 3741
dtype: int64

Тем не менее, эти конструкции  в настоящее время объекты Python, так что мы не сможем использовать словарные функции.

DataFrame

DataFrame — это проиндексированный многомерный массив значений, соответственно каждый столбец DataFrame, является структурой Series.

DataFrames похожи на электронные таблицы или SQL таблицы. В общем, когда вы будете работать с библиотекой pandas, то DataFrames будет самым распространенным объектом который вы будете использовать.

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

Первой серией(Series) будет наш avg_ocean_depth( мы его создавали раньше), а наша вторая будет max_ocean_depth, и она содержит данные о максимальной глубине каждого океана на Земле( в метрах):

ocean.py

import numpy as np
import pandas as pd
avg_ocean_depth = pd.Series({
‘Arctic’: 1205,
‘Atlantic’: 3646,
‘Indian’: 3741,
‘Pacific’: 4080,
‘Southern’: 3270
})
max_ocean_depth = pd.Series({
‘Arctic’: 5567,
‘Atlantic’: 8486,
‘Indian’: 7906,
‘Pacific’: 10803,
‘Southern: 7075
})

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

Наша конструкция построена таким образом, что мы можем добавлять названия в заголовки столбцов таким образом, как будто мы объявляем ключи к значениям серии (Series). Чтобы увидеть что у нас получилось вызовите print():

ocean.py

..
max_ocean_depth = pd.Series({
‘Arctic’: 5567,
‘Atlantic’: 8486,
‘Indian’: 7906,
‘Pacific’: 10803,
‘Southern’: 7075
})
ocean_depths = pd.DataFrame({
‘Avg. Depth (m)’: avg_ocean_depth,
‘Max. Depth (m)’: max_ocean_depth
})
print(ocean_depths)

Output
Avg. Depth (m) Max. Depth (m)
Arctic 1205 5567
Atlantic 3646 8486
Indian 3741 7906
Pacific 4080 10803
Southern 3270 7075

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

Сортировка данных в DataFrames

Мы можем сортировать данные в DataFrame с помощью функции DataFrame.sort_values (by = …) . Например, давайте используем восходящий логический параметр, который может быть истинным(True) или ложным(False). Обратите внимание, что функции мы можем передать восходящий параметр, но не нисходящий.

ocean_depth.py


print(ocean_depths.sort_values(‘Avg. Depth (m)’, ascending=True))

Output
Avg. Depth (m) Max. Depth (m)
Arctic 1205 5567
Southern 3270 7075
Atlantic 3646 8486
Indian 3741 7906
Pacific 4080 10803

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

Статистический анализ данных c DataFrames

Далее, давайте посмотрим на некоторые статистические данные, которые мы можем почерпнуть из pandas с помощью функции DataFrame.describe ().

Функция DataFrame.describe () на нашем примере  выведет примерно следующую информацию:


print(ocean_depths.describe())

Output
Avg. Depth (m) Max. Depth (m)
count 5.000000 5.000000
mean 3188.400000 7967.400000
std 1145.671113 1928.188347
min 1205.000000 5567.000000
25% 3270.000000 7075.000000
50% 3646.000000 7906.000000
75% 3741.000000 8486.000000
max 4080.000000 10803.000000

Обработка недостающих значений

Часто при работе с данными вы можете потерять некоторую информацию. Библиотека pandas предоставляет множество различных способов для работы с отсутствующими данными. Данные методы ссылаются на нулевые данные или данные, которые не присутствуют по некоторым причинам. В pandas, они называются NA и отображаются как NaN.

Распознать эти пропущенные значения  нам поможет функция DataFrame.dropna(), а обработать и заполнить их можно с помощью функции DataFrame.fillna(). 

Давайте создадим новый файл с именем user_data.py и заполним его некоторыми данными, в которых есть недостающие значения, а в конце сделаем из него объект DataFrame:

user_data.py

import numpy as np
import pandas as pd
user_data = {‘first_name‘: [‘Sammy‘, ‘Jesse‘, np.nan, ‘Jamie‘],
last_name‘: [‘Shark‘, ‘Octopus‘, np.nan, ‘Mantis shrimp‘],
online‘: [True, np.nan, False, True],
‘followers’: [987, 432, 321, np.nan]}
df = pd.DataFrame(user_data, columns = [‘first_name‘, ‘last_name‘, ‘online‘, ‘followers‘])
print(df)

Наша функция  print() в конце программы выведет такой результат:

Output
first_name last_name online followers
0 Sammy Shark True 987.0
1 Jesse Octopus NaN 432.0
2 NaN NaN False 321.0
3 Jamie Mantis shrimp True NaN

Можно увидеть что здесь достаточно много пропущенных значений.

Давайте мы их сначала удалим с помощью функции dropna():

user_data.py


df_drop_missing = df.dropna()
print(df_drop_missing)

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

Output
first_name last_name online followers
0 Sammy Shark True 987.0

Теперь мы можем заполнить пустые значения нулями и сделаем мы это с помощью функции DataFrame.fillna(0).

Удалите или закомментируйте 2 последние строчки и добавьте в конец следующее:

user_data.py


df_fill = df.fillna(0)
print(df_fill)

Когда мы запустим программу, то получим следующее:

Output
first_name last_name online followers
0 Sammy Shark True 987.0
1 Jesse Octopus 0 432.0
2 0 0 False 321.0
3 Jamie Mantis shrimp True 0.0

Теперь все наши столбцы и строки не повреждены, и вместо NaN  мы теперь имеем 0.

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