Pandas на практических примерах

2906

Это дополнение к «Основы Pandas». Вместо теоретического вступления в миллион особенностей Pandas — 2 примера:

  1. Данные с космического телескопа «Хаббл».
  2. Датасет о заработной плате экономически активного населения США.

Данные «Хаббла»

Начнем с данных «Хаббла». В первую очередь речь пойдет о том, как читать простой csv-файл и строить данные:

Начнем с данных с космического телескопа «Хаббл», одного из известнейших телескопов.

Данные очень простые. Файл называется hubble_data.csv. Его можно открыть даже в Microsoft Excel или OpenOffice. Вот как он будет выглядеть в этих программах:

Вид csv файла

Данные в формате CSV. Это очень популярный формат в первую очередь из-за своей простоты. Его можно открыть в любом текстовом редакторе. Попробуйте.

Будет видно, что CSV-файлы — это всего лишь разные значения, разделенные запятой (что, собственно, и подразумевается в названии — comma-separated values).

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

Python data course

Начнем. Откройте экземпляр Ipython (Jupyter) и запустите следующий код.

import pandas as pd
import matplotlib.pyplot as plt
%pylab inline

Это импортирует pandas — основную библиотеку в Python для анализа данных. Также импортируется matplotlib для построения графиков.

%pylan inline — это команда Ipython, которая позволяет использовать графики в работе.

data = pd.read_csv("hubble_data.csv")
data.head()

Pandas значительно упрощает жизнь. Прочесть файл csv можно с помощью одной функции: read_csv().

Теперь можно вызвать функцию head(), чтобы вывести первые пять строк.

distancerecession_velocity
00.032170
10.034290
20.214-130
30.263-70
40.275-185

Pandas — довольно умная библиотека. Это проявляется в том, что она понимает, что первая строка файла — это заголовок. Вот как выглядят первые 3 строки CSV-файла:

distance,recession_velocity
.032,170
.034,290

Теперь можно увидеть, что заголовок в верхней части действительно есть. Он называет две колонки: distance и recession_velocity.

Pandas корректно распознает это.

А что делать, если заголовка нет? Можно прочесть файл, вручную указав заголовки. Есть еще один файл hubble_data_no_headers.csv без заголовков. Он не отличается от предыдущего за исключением отсутствующих заголовков.

Вот как читать такой файл:

headers = ["dist","rec_vel"]

data_no_headers = pd.read_csv("hubble_data_no_headers.csv", names=headers)

data_no_headers.head()

Здесь объявляются собственные заголовки (headers). У них другие имена (dist и rec_vel), чтобы было явно видно, что это другой файл.

Данные читаются таким же способом, но в этот раз передаются новые переменные names=headers. Это сообщает Pandas, что нужно использовать их, поскольку в файле заголовков нет. Затем выводятся первые пять строк.

distrec_vel
00.032170
10.034290
20.214-130
30.263-70
40.275-185

Pandas позволяет увидеть только одну колонку:

data_no_headers["dist"]

0  	0.032
1  	0.034
2  	0.214
3 	0.263
4  	0.275

Теперь, когда данные есть, на их основе нужно построить график.

Проще всего добиться этого, избавившись от индексов. Pandas по умолчанию добавляет номера (как и Excel). Если посмотреть на структуру данных, будет видно, что левая строка имеет значения 0,1,2,3,4....

Если заменить номера на distance, тогда построение графиков станет еще проще. distance станет осью x, а velocity — осью y.

Но как заменить индексы?

data.set_index("distance", inplace=True)
data.head()
distancerecession_velocity
0.032170
0.034290
0.214-130
0.263-70
0.275-185

При сравнении с прошлым примером можно увидеть, что номера пропали. Более того, данные теперь расположены в соотношении x — y.

Создать график теперь еще проще:

data.plot()
plt.show()

Пример графика pandas

Данные о заработной плате

Теперь данные о заработной плате. Этот пример построен на предыдущем и показывает, как добавлять собственные заголовки, работать с файлами, разделенными отступами, и извлекать колонки из данных:

Этот пример посложнее.

Откройте ноутбук. Начнем, как и раньше, с импорта необходимых модулей и чтения CSV-файла. В данном случае речь идет о файле wages_hours.csv.

import pandas as pd
import matplotlib.pyplot as plt
%pylab inline

data = pd.read_csv("wages_hours.csv")
data.head()

Все как раньше. Нужно ведь просто прочесть файл? Но результат получается следующий:

HRS RATE ERSP ERNO NEIN ASSET AGE DEP RACE SCHOOL
02157\t2.905\t1121\t291\t380\t7250\t38.5\t2.340…
12174\t2.970\t1128\t301\t398\t7744\t39.3\t2.335…
22062\t2.350\t1214\t326\t185\t3068\t40.1\t2.851…
32111\t2.511\t1203\t49\t117\t1632\t22.4\t1.159\…
42134\t2.791\t1013\t594\t730\t12710\t57.7\t1.22…

Выглядит непонятно. И совсем не похоже на оригинальный файл.

Что же случилось?

В CSV-файле нет запятых

Хотя название подразумевает «Значения, Разделенные Запятыми», данные могут быть разделены чем угодно. Например, отступами.

\t в тексте означает отступы. Pandas не может разобрать файл, потому что библиотека рассчитывала на запятые, а не на отступы.

Нужно прочитать файл еще раз, в этот раз передав новую переменную sep='\t'. Это сообщит, что разделителями выступают отступы, а не запятые.

data = pd.read_csv("wages_hours.csv", sep="\t")
data.head()
HRSRATEERSPERNONEINASSETAGEDEPRACESCHOOL
021572.9051121291380725038.52.34032.110.5
121742.9701128301398774439.32.33531.210.5
220622.3501214326185306840.12.851*8.9
321112.511120349117163222.41.15927.511.5
421342.79110135947301271057.71.22932.58.8

Сработало.

Но тут довольно много данных. Нужны ли они все?

В этом проекте необходимы только AGE (возраст) и RACE (ставка заработной платы). В первую очередь необходимо извлечь только эти две колонки.

data2 = data[["AGE", "RATE"]]
data2.head()
AGERATE
038.52.905
139.32.970
240.12.350
322.42.511
457.72.791

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

Сделаем в порядке убывания (потому что это поведение по умолчанию для функции sort()).

data_sorted = data2.sort(["AGE"])
data_sorted.head()

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

data_sorted.set_index("AGE", inplace=True)
data_sorted.head()
AGERATE
22.42.511
37.23.015
37.41.901
37.51.899
37.53.009

И сам график:

data_sorted.plot()
plt.show()

пример графика pandas

Можно увидеть, что ставка повышается до 35 лет, а потом начинает сильно меняться.

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

Тест на знание python

Какой будет результат выполнения кода — print(abc) ?
Какой будет результат выполнения этого кода?
Что делает код ниже?
Какой код выведет строку — "C:\Common\testString.doc" ?
Что выведет этот код?