Пользователь
0,0
рейтинг
9 октября 2013 в 17:10

Разработка → Введение в анализ данных с помощью 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, содержащий магазины и количество отгрузок:
shop qty
427 3
707 4
957 2
437 1

И df2, содержащий магазин и его город:
shop name
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 после выполнения выше описанных операций:
shop country name
347 Украина Киев
427 РФ Самара
707 Беларусь Минск
957 РФ Иркутск
437 РФ Москва

Теперь на надо выбрать магазин, у которого страна будет равна `Украина`. Для обращения к столбцам в DataFrame существует 2 способа:
  • через точку — НаборДанных.ИмяПоля
  • в квадратных скобках – НаборДанных[‘ИмяПоля’]

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

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

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

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


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

В качестве параметров функция принимает:
  • набор данных (который будет присоединен к исходному)
  • тип соединения
  • поле, по которому происходит соединение

Подробнее о параметрах можно прочитать в документации. Набор данных перед финальной операцией выглядит так:
shop country name qty
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)

Итоговая таблица будет выглядеть так:
country qty
Беларусь 4
РФ 6
Украина 0

Заключение


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

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (14)

  • +5
    Хорошая тема, и на русском почти ничего нет — пишите еще!
  • +1
    Очень интересно было бы почитать про анализ временных рядов в pandas.
    • 0
      Wes McKinney, автор pandas, давал прекрасный туториал по анализу временных рядов при помощи своей библиотеки на SpiPy 2012 pyvideo.org/video/1198/time-series-data-analysis-with-pandas. Там три часа, но их стоит посмотреть все, если вы действительно занимаетесь интерактивным анализом данных :) Также у него есть замечательная книга, которая не только про пандас, но про весь джентельменский набор необходимый для анализа и визуализации данных в питоне — «Python for Data Analysis». В сети находится на раз, но и стоит сравнительно не дорого :)
  • +2
    На мой взгляд, ipython+pandas+mathplotlib — это замена R для знающих Python. Список с pydata.org только подтверждает наблюдение.

    Столкнулся с Pandas в рамках курса «Computational Investing». Там автор пишет (и продвигает) свою собственную библиотеку с pydata.org-тулзами под капотом. В запуске курса от 2012 года были накладки организационного характера и неплотная подача материала, но если нужен повод попробовать инструмент, то это вариант.
    • 0
      На мой взгляд, ipython+pandas+mathplotlib — это замена R для знающих Python.
      По существу сборки типа Anaconda или Python(x,y) неплохо справляются с этим.
    • 0
      В целом, да. Однако же я встречал вещи, которые есть в R, но которых нет (или они очень криво имплементированы) в питоне… Например, многое, что связано с анализом временных рядов
      • 0
        Можно пример, если не сложно? :)
        • 0
          Например, модель ARIMA и ей подобные
          • 0
            Если вы имеете в виду статистические модели, то да, пока с ними не всё хорошо, хотя ребята из statsmodels работают над этим (там, кстати, и ARIMA есть). Конечно у R большое легаси и существует масса специализированных пакетов, которые могут делать с данными почти всё, что угодно. Для чистых статистиков R ещё долго будет оставаться главным инструментом.

            Однако 90% времени работы с данными (по крайней мере в моей области) это форматирование, нахождение среднего и сложение. С этим пандас, на мой взгляд, справляется лучше R, поскольку синтакс там сделан для людей :) Ну а если что-то из R сильно захочется использовать, вплоть до графики, всегда можно это сделать не вылезая из ipython notebook :)
  • 0
    Спасибо за статью. Было бы действительно здорово иметь больше информации на русском про pandas в частности и обработку данных в питоне в общем. Жаль, что говоря о pandas, вы не упомянули об ipython notebook, поскольку именно в нём эта библиотека раскрывается полностью. Она задумывалась больше как интерактивный инструмент, и интеграция с ноутбуком (ну или на худой конец просто с ipython) позволяет быстро создавать графику и смотреть на табицы в удобном виде. Если использовать её просто как замену базе данных, смысл несколько теряется :)
    • 0
      Жаль, что говоря о pandas, вы не упомянули об ipython notebook
      Спасибо за комментарий в следующих статьях постараюсь исправиться, здесь я хотел написать именно про самый базовый функционал. Про среду разработки и интеграцию с ipython постараюсь написать отдельную статью.
  • 0
    Для тех, кому английский не помеха есть книга Python for Data Analysis с целой главой посвященной Pandas.
    Да и вообще рекомендую всю книгу к прочтению. Много примеров. Хотя похоже, что перевода этой книги еще нет.
  • 0
    Буквально недавно тоже заморочился на целый рабочий день.
    Нужно было заглатывать большие xls файлы, как-то их обрабатывать и сливать в Mongo или sql`ную базу.
    Однако, так и не увидел ничего, что нельзя было бы сделать в SQLной БД.
    Все приведенные примеры с неимоверной легкостью решаются в мускуле или пг.
    Просто вместо read_csv — load data infile…
    Ну и в способности sql окучить табличку длиной миллионов в 20 записей сомнений нет. А вот насчет Pandas — есть, хоть я и не пробовал 8-)
    Единственная удобная тема — чтение экселевых файлов, но это и xlrd делает. Точнее, Pandas в вопросах xls — надстройка над xlrd.
    Короче, не придумал, зачем бы оно было нужно = забил.
    • 0
      То, что все эти примеры с легкостью решаются с sql сомнений нет и загрузить их туда тоже можно разными способами. Это лишь элементарные примеры. Например визуализацию в sql не сделаешь. И не очень удобно загружать файлы в базу особенно если их штук 15. Кроме того в pandas также можно загружать в наборы данных не только xls, но и xlsx. Или же сводную таблицу, насколько я знаю, средствами sql тоже не составишь.

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