среда, 9 октября 2013 г.

[Из песочницы] Введение в анализ данных с помощью Pandas

Сегодня речь пойдет о пакете Pandas. Данный пакет делает Python мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным, а при наличии пакета matplotlib дает возможность рисовать графики на полученных наборах данных. Далее будут показаны основы работы с пакетом, такие как загрузка данных, обращение к полям, фильтрация и построение сводных.



Основные структуры данных и их загрузка




Для начала, скажем, пару слов о структурах хранения данных в Pandas. Основными являются Series и DataFrame.

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

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

Итак, со структурами чуток разобрались. Перейдем непосредственно к работе с пакетом. Для начала анализа каких-либо данных их надо загрузить. Pandas предоставляет широкий выбор источников данных, например:


  • SQL

  • Текстовые файлы

  • Excel файлы

  • HTML




Подробней о них можно прочитать в документации.

Для пример загрузим 2 текстовых файла. Это можно сделать функцией read_csv():

from pandas import read_csv
df1 = read_csv("df1.txt")
df2 = read_csv("df2.txt",";") #второй аргумент задает разделитель




Теперь у нас есть 2 набора данных df1, содержащий магазины и количество отгрузок:






















shopqty
4273
7074
9572
4371



И df2, содержащий магазин и его город:


























shopname
347Киев
427Самара
707Минск
957Иркутск
437Москва



Базовые операции с наборами данных




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


  1. в набор с городами магазинов добавим поле `country` и заполним соответствующими странами

  2. выберем украинский магазин и поменяем его номер

  3. добавим магазин, полученный на предыдущем шаге, к общему списку

  4. добавим количество из df1 к набору df2

  5. построим сводную таблицу по странам и количеству отгрузок




Итак, для добавления нового столбца в набор данных существует команда insert():

country = [u'Украина',u'РФ',u'Беларусь',u'РФ',u'РФ']
df2.insert(1,'country',country)




В нашем случае функции передается 3 аргумент:


  1. номер позиции, куда будет вставлен новый столбец

  2. имя нового столбца

  3. массив значений столбца (в нашем случае, это обычный список list)




Вид df2 после выполнения выше описанных операций:
































shopcountryname
347УкраинаКиев
427РФСамара
707БеларусьМинск
957РФИркутск
437РФМосква



Теперь на надо выбрать магазин, у которого страна будет равна `Украина`. Для обращения к столбцам в DataFrame существует 2 способа:


  • через точку — НаборДанных.ИмяПоля

  • в квадратных скобках – НаборДанных[‘ИмяПоля’]




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

t = df2[df2.country == u'Украина']
t.shop = 345




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












shopcountryname
345УкраинаКиев



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

df2 = df2.append(t)




Агрегация данных




Теперь к нашему основному списку магазинов df2, можно подтянуть количество из набора данных df1. Сделать это можно с помощью функции merge(), которая соединяет два набора данных (аналог join в SQL):

res = df2.merge(df1, 'left', on='shop')




В качестве параметров функция принимает:


  • набор данных (который будет присоединен к исходному)

  • тип соединения

  • поле, по которому происходит соединение




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












































shopcountrynameqty
347УкраинаКиевNaN
427РФСамара3
707БеларусьМинск4
957РФИркутск2
437РФМосква1
345УкраинаКиевNaN



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


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

  • список столбцов, которые будут строками итоговой таблицы

  • функция, которая используется для агрегации

  • параметр для замены пустых значений на 0




Код для построения сводной выглядит так:

res.pivot_table(['qty'],['country'], aggfunc='sum', fill_value = 0)




Итоговая таблица будет выглядеть так:


















countryqty
Беларусь4
РФ6
Украина0



Заключение




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

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий