Введение в pandas: анализ данных на Python
4 Март 2017 , Python, 499827 просмотров, Introduction to pandas: data analytics in Python
pandas это высокоуровневая Python библиотека для анализа данных. Почему я её называю высокоуровневой, потому что построена она поверх более низкоуровневой библиотеки NumPy (написана на Си), что является большим плюсом в производительности. В экосистеме Python, pandas является наиболее продвинутой и быстроразвивающейся библиотекой для обработки и анализа данных. В своей работе мне приходится пользоваться ею практически каждый день, поэтому я пишу эту краткую заметку для того, чтобы в будущем ссылаться к ней, если вдруг что-то забуду. Также надеюсь, что читателям блога заметка поможет в решении их собственных задач с помощью pandas, и послужит небольшим введением в возможности этой библиотеки.
DataFrame и Series
Чтобы эффективно работать с pandas, необходимо освоить самые главные структуры данных библиотеки: DataFrame и Series. Без понимания что они из себя представляют, невозможно в дальнейшем проводить качественный анализ.
Series
Структура/объект Series представляет из себя объект, похожий на одномерный массив (питоновский список, например), но отличительной его чертой является наличие ассоциированных меток, т.н. индексов, вдоль каждого элемента из списка. Такая особенность превращает его в ассоциативный массив или словарь в Python.
В строковом представлении объекта Series, индекс находится слева, а сам элемент справа. Если индекс явно не задан, то pandas автоматически создаёт RangeIndex от 0 до N-1, где N общее количество элементов. Также стоит обратить, что у Series есть тип хранимых элементов, в нашем случае это int64, т.к. мы передали целочисленные значения.
У объекта Series есть атрибуты через которые можно получить список элементов и индексы, это values и index соответственно.
Доступ к элементам объекта Series возможны по их индексу (вспоминается аналогия со словарем и доступом по ключу).
Индексы можно задавать явно:
Делать выборку по нескольким индексам и осуществлять групповое присваивание:
Фильтровать Series как душе заблагорассудится, а также применять математические операции и многое другое:
Если Series напоминает нам словарь, где ключом является индекс, а значением сам элемент, то можно сделать так:
У объекта Series и его индекса есть атрибут name, задающий имя объекту и индексу соответственно.
Индекс можно поменять «на лету», присвоив список атрибуту index объекта Series
Имейте в виду, что список с индексами по длине должен совпадать с количеством элементов в Series.
DataFrame
Объект DataFrame лучше всего представлять себе в виде обычной таблицы и это правильно, ведь DataFrame является табличной структурой данных. В любой таблице всегда присутствуют строки и столбцы. Столбцами в объекте DataFrame выступают объекты Series, строки которых являются их непосредственными элементами.
DataFrame проще всего сконструировать на примере питоновского словаря:
Чтобы убедиться, что столбец в DataFrame это Series, извлекаем любой:
Объект DataFrame имеет 2 индекса: по строкам и по столбцам. Если индекс по строкам явно не задан (например, колонка по которой нужно их строить), то pandas задаёт целочисленный индекс RangeIndex от 0 до N-1, где N это количество строк в таблице.
В таблице у нас 4 элемента от 0 до 3.
Доступ по индексу в DataFrame
Индекс по строкам можно задать разными способами, например, при формировании самого объекта DataFrame или «на лету»:
Как видно, индексу было задано имя — Country Code. Отмечу, что объекты Series из DataFrame будут иметь те же индексы, что и объект DataFrame:
Доступ к строкам по индексу возможен несколькими способами:
- .loc — используется для доступа по строковой метке
- .iloc — используется для доступа по числовому значению (начиная от 0)
Можно делать выборку по индексу и интересующим колонкам:
Как можно заметить, .loc в квадратных скобках принимает 2 аргумента: интересующий индекс, в том числе поддерживается слайсинг и колонки.
Фильтровать DataFrame с помощью т.н. булевых массивов:
Кстати, к столбцам можно обращаться, используя атрибут или нотацию словарей Python, т.е. df.population и df[‘population’] это одно и то же.
Сбросить индексы можно вот так:
pandas при операциях над DataFrame, возвращает новый объект DataFrame.
Добавим новый столбец, в котором население (в миллионах) поделим на площадь страны, получив тем самым плотность:
Не нравится новый столбец? Не проблема, удалим его:
Особо ленивые могут просто написать del df[‘density’].
Переименовывать столбцы нужно через метод rename:
В этом примере перед тем как переименовать столбец Country Code, убедитесь, что с него сброшен индекс, иначе не будет никакого эффекта.
Чтение и запись данных
pandas поддерживает все самые популярные форматы хранения данных: csv, excel, sql, буфер обмена, html и многое другое:
Чаще всего приходится работать с csv-файлами. Например, чтобы сохранить наш DataFrame со странами, достаточно написать:
Функции to_csv ещё передаются различные аргументы (например, символ разделителя между колонками) о которых подробнее можно узнать в официальной документации.
Считать данные из csv-файла и превратить в DataFrame можно функцией read_csv.
Аргумент sep указывает разделитесь столбцов. Существует ещё масса способов сформировать DataFrame из различных источников, но наиболее часто используют CSV, Excel и SQL. Например, с помощью функции read_sql, pandas может выполнить SQL запрос и на основе ответа от базы данных сформировать необходимый DataFrame. За более подробной информацией стоит обратиться к официальной документации.
Группировка и агрегирование в pandas
Группировка данных один из самых часто используемых методов при анализе данных. В pandas за группировку отвечает метод .groupby. Я долго думал какой пример будет наиболее наглядным, чтобы продемонстрировать группировку, решил взять стандартный набор данных (dataset), использующийся во всех курсах про анализ данных — данные о пассажирах Титаника. Скачать CSV файл можно тут.
Необходимо подсчитать, сколько женщин и мужчин выжило, а сколько нет. В этом нам поможет метод .groupby.
А теперь проанализируем в разрезе класса кабины:
Сводные таблицы в pandas
Термин «сводная таблица» хорошо известен тем, кто не по наслышке знаком с инструментом Microsoft Excel или любым иным, предназначенным для обработки и анализа данных. В pandas сводные таблицы строятся через метод .pivot_table. За основу возьмём всё тот же пример с Титаником. Например, перед нами стоит задача посчитать сколько всего женщин и мужчин было в конкретном классе корабля:
В качестве индекса теперь у нас будет пол человека, колонками станут значения из PClass, функцией агрегирования будет count (подсчёт количества записей) по колонке Name.
Всё очень просто.
Анализ временных рядов
В pandas очень удобно анализировать временные ряды. В качестве показательного примера я буду использовать цену на акции корпорации Apple за 5 лет по дням. Файл с данными можно скачать тут.
Здесь мы формируем DataFrame с DatetimeIndex по колонке Date и сортируем новый индекс в правильном порядке для работы с выборками. Если колонка имеет формат даты и времени отличный от ISO8601, то для правильного перевода строки в нужный тип, можно использовать метод pandas.to_datetime.
Давайте теперь узнаем среднюю цену акции (mean) на закрытии (Close):
А если взять промежуток с февраля 2012 по февраль 2015 и посчитать среднее:
А что если нам нужно узнать среднюю цену закрытия по неделям?!
Resampling мощный инструмент при работе с временными рядами (time series), помогающий переформировать выборку так, как удобно вам. Метод resample первым аргументом принимает строку rule. Все доступные значения можно найти в документации.
Визуализация данных в pandas
Для визуального анализа данных, pandas использует библиотеку matplotlib. Продемонстрирую простейший способ визуализации в pandas на примере с акциями Apple.
Берём цену закрытия в промежутке между 2012 и 2017.
И видим вот такую картину:
По оси X, если не задано явно, всегда будет индекс. По оси Y в нашем случае цена закрытия. Если внимательно посмотреть, то в 2014 году цена на акцию резко упала, это событие было связано с тем, что Apple проводила сплит 7 к 1. Так мало кода и уже более-менее наглядный анализ 😉
Эта заметка демонстрирует лишь малую часть возможностей pandas. Со своей стороны я постараюсь по мере своих сил обновлять и дополнять её.
Полезные ссылки
- pandas cheatsheet
- Официальная документация pandas
- Почему Python
- Python Data Science Handbook
💌 Присоединяйтесь к рассылке
Понравился контент? Пожалуйста, подпишись на рассылку.
Источник
Сводные таблицы Панд в Python – Простое руководство
В этой статье мы поговорим о сводных таблицах в Python. Мы реализуем то же самое с помощью функции pivot_table в модуле Pandas.
Автор: Pankaj Kumar
Дата записи
В этой статье мы поговорим о сводных таблицах в Python. Мы реализуем то же самое с помощью функции pivot_table в модуле Pandas .
Что такое Сводная таблица?
Сводные таблицы являются ключевой особенностью Microsoft Excel и одной из причин, по которой Excel стал таким популярным в корпоративном мире.
Сводные таблицы обеспечивают большую гибкость для выполнения анализа данных.
Это позволяет нам преобразовывать столбцы в строки, а строки в столбцы. Поскольку он позволяет группировать по любому параметру, его можно легко спутать с функцией pandas Groupby .
Подумайте о сводных таблицах как о многомерной версии функции GroupBy .
Шаги по реализации сводных таблиц в Python
Давайте сразу перейдем к реализации сводных таблиц в Python.
1. Загрузите набор данных по вашему выбору
Мы будем анализировать покемонов с помощью набора данных статистики (загруженного из Kaggle). Вы можете получить набор данных здесь .
И на случай, если вам интересно Что такое покемоны? для ясности вы можете проверить эту ссылку .
Независимо от того, любите ли вы покемонов или нет, вы все равно можете получить 100% от этой статьи.
Нужно поймать их всех.… 🙂
2. Синтаксис метода pivot_table()
После вызова метода pivot_table в фрейме данных давайте разберем основные входные аргументы , данные методу.
- data – это числовой столбец, к которому мы применяем функцию агрегации. например, продажи, скорость, цена и т. Д.
- index – Столбцы, которые мы хотим преобразовать в строки. мы можем передать несколько значений в виде списка.
- columns – Переменные столбца, которые мы теперь хотим сохранить как столбец.
- aggfunc – тип операции, выполняемой с данными, т. е. сумма, среднее значение, количество и т. Д.
Это будет намного яснее на примере.
3. Реализация сводных таблиц в Python
Допустим, нам нужно найти среднюю скорость покемонов, принадлежащих к типу 1.
Это можно легко сделать с помощью pandas Groupby , но тот же результат можно легко получить с помощью pivot_table с гораздо более чистым кодом.
С каждым примером мы будем медленно исследовать pivot_table во всей его красе.
Аналогичный результат с использованием pivot_table
4. Найдите среднюю скорость с помощью сводных таблиц
Но теперь, если бы нас попросили найти среднюю скорость каждого покемона типа 1, а также разделить их на легендарных и Не Легендарных.
Тада! С помощью одной строки кода мы смогли добиться желаемых результатов.
Я не мог не заметить, что в среднем Легендарные Покемоны были быстрее, чем нелегендарные. Магия сводных таблиц.
Здесь важно понять, что нам нужен столбец типа 1 в качестве индекса, поэтому мы передали его в аргумент индекса в методе pivot_table.
Но теперь, поскольку каждый покемон типа 1 принадлежал либо к Легендарной категории, либо к Не Легендарной, мы просто преобразовали наш фрейм данных таким образом, чтобы он теперь показывал среднюю скорость каждого типа.
Теперь у нас есть легендарные или не легендарные функции в наших данных.
Поскольку нам нужна была “Легендарная” функция в наших данных в качестве столбца новых данных, нам просто нужно было передать ее в параметре columns . Давайте немного изменим наш набор данных и проведем новый анализ.
Теперь мы создаем ячейки переменной скорости в качестве новой добавленной функции.
Теперь давайте выведем фрейм данных, который показывает среднюю скорость на основе легендарной функции и функции диапазона скоростей.
Я призываю вас попробовать pandas pivot_table на наборе данных Titanic, поскольку это дополнит вашу практику в этой теме.
Сводные таблицы в Python-непростая тема для освоения, но, учитывая преимущества, которые она может предложить, необходимо обязательно включить эти знания в свой инструментарий анализа. Помните, что практика-это ключ здесь!
Вывод
в этой статье мы попытались получить некоторое представление о Pandas pivot_table , реализовав его на наборе данных. Мы поняли, что это многомерная версия операции groupby (концептуально говоря). Счастливого Обучения!
Источник
Как создать сводную таблицу в Pandas Python
Добавить в избранное
Главное меню » Программирование » Python » Как создать сводную таблицу в Pandas Python
(1 оценок, среднее: 5,00 из 5)
Загрузка.
Перед использованием сводной таблицы panda убедитесь, что вы понимаете свои данные и вопросы, которые вы пытаетесь решить с помощью сводной таблицы. Используя этот метод, вы можете добиться впечатляющих результатов. В этой статье мы подробно рассмотрим, как создать сводную таблицу в pandas python.
Чтение данных из файла Excel
Мы скачали базу данных по продажам продуктов питания в формате Excel. Перед началом реализации вам необходимо установить некоторые необходимые пакеты для чтения и записи файлов базы данных Excel. Введите следующую команду в разделе терминала редактора pycharm:
Теперь прочтите данные из таблицы Excel. Импортируйте необходимые библиотеки panda и измените путь к вашей базе данных. Затем, запустив следующий код, можно получить данные из файла.
Здесь данные считываются из базы данных Excel по продажам продуктов питания и передаются в переменную dataframe.
Создайте сводную таблицу с помощью Pandas Python
Ниже мы создали простую сводную таблицу, используя базу данных о продажах продуктов питания. Для создания сводной таблицы требуются два параметра. Первый – это данные, которые мы передали в фрейм данных, а второй – индекс.
Сводные данные по индексу
Индекс – это функция сводной таблицы, которая позволяет группировать данные в соответствии с требованиями. Здесь мы взяли «Product» в качестве индекса для создания базовой сводной таблицы.
Явно определите столбцы
Для более подробного анализа ваших данных явно укажите имена столбцов с индексом. Например, мы хотим отображать в результате только UnitPrice каждого продукта. Для этого добавьте параметр значений в свою сводную таблицу. Следующий код дает тот же результат:
Сводные данные с мультииндексом
Данные могут быть сгруппированы на основе более чем одного объекта в качестве индекса. Используя многоиндексный подход, вы можете получить более конкретные результаты для анализа данных. Например, товары относятся к разным категориям. Таким образом, вы можете отобразить индекс «Product» и «Category» с доступными значениями «Quantity» и «UnitPrice» для каждого продукта следующим образом:
Применение функции агрегирования в сводной таблице
В сводной таблице aggfunc можно применять для разных значений функций. Результирующая таблица – это сводка данных по функциям. Агрегатная функция применяется к данным вашей группы в pivot_table. По умолчанию агрегатная функция – np.mean(). Но в зависимости от требований пользователя для разных функций данных могут применяться разные агрегатные функции.
В этом примере мы применили агрегатные функции. Функция np.sum() используется для функции «Quantity», а функция np.mean() – для функции «UnitPrice».
Используя параметр значения, вы также можете применить агрегатную функцию для определенной функции. Если вы не укажете значение функции, она объединит числовые характеристики вашей базы данных. Следуя данному исходному коду, вы можете применить агрегатную функцию для конкретной функции:
Различия между значениями и столбцами в сводной таблице
Значения и столбцы являются основным запутывающим моментом в pivot_table. Важно отметить, что столбцы являются необязательными полями, отображая значения результирующей таблицы горизонтально вверху. Функция агрегирования aggfunc применяется к перечисляемому вами полю значений.
Обработка отсутствующих данных в сводной таблице
Вы также можете обработать отсутствующие значения в сводной таблице с помощью параметра fill_value. Это позволяет вам заменить значения NaN некоторым новым значением, которое вы предоставляете для заполнения.
Например, мы удалили все нулевые значения из приведенной выше результирующей таблицы, запустив следующий код и заменив значения NaN на 0 во всей результирующей таблице.
Фильтрация в сводной таблице
Как только результат будет сгенерирован, вы можете применить фильтр, используя стандартную функцию фрейма данных. Возьмем пример. Отфильтруйте те продукты, у которых UnitPrice меньше 60. Он отображает те продукты, цена которых меньше 60.
Используя другой метод запроса, вы можете фильтровать результаты. Например, например, мы отфильтровали категорию файлов cookie на основе следующих функций:
Визуализируйте данные сводной таблицы
Чтобы визуализировать данные сводной таблицы, выполните следующий метод:
В приведенной выше визуализации мы показали цену за единицу различных продуктов вместе с категориями.
Вывод
Мы изучили, как вы можете создать сводную таблицу из фрейма данных с помощью Pandas python. Сводная таблица позволяет глубже анализировать наборы данных. Мы видели, как сгенерировать простую сводную таблицу с помощью мультииндекса и применить фильтры к сводным таблицам. Кроме того, мы также показали, как построить данные сводной таблицы и заполнить недостающие данные.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Excel и Python. Создание сводной таблицы при помощи Python
Для начала давайте представим, что мы являемся аналитиками в фирме по продаже компьютеров, программного обеспечения к ним, а также оказываем услуги по техническому сопровождению. Нам поставлена задача проанализировать участие компании в различных аукционах. Таблица с исходными данными представлена ниже:
Аукцион | Контрагент | Контакт | Менеджер | Продукт | Количество | Цена | Статус |
424845 | Ильин и Ко | Сергей Ильин | Илья Сергеев | Компьютер | 4 | 45 200 | на рассмотрении |
312058 | Ильин и Ко | Сергей Ильин | Илья Сергеев | Софт | 2 | 37 600 | на рассмотрении |
918390 | Ильин и Ко | Сергей Ильин | Илья Сергеев | Тех. сопровождение | 2 | 21 200 | в ожидании |
997345 | Ильин и Ко | Сергей Ильин | Илья Сергеев | Компьютер | 5 | 39 100 | отменен |
496901 | Шахты плюс | Данил Сидоров | Илья Сергеев | Компьютер | 3 | 13 600 | выигран |
800437 | Шахты плюс | Данил Сидоров | Илья Сергеев | Компьютер | 1 | 24 400 | в ожидании |
967756 | Шахты плюс | Данил Сидоров | Илья Сергеев | Софт | 1 | 6 700 | на рассмотрении |
871434 | Альма | Женя Сидин | Илья Сергеев | Тех. сопровождение | 2 | 7 000 | в ожидании |
131102 | Альма | Женя Сидин | Илья Сергеев | Компьютер | 4 | 42 000 | отменен |
191777 | Микрошкин | Сергей Минин | Павел Попов | Компьютер | 3 | 28 900 | выигран |
225531 | Микрошкин | Сергей Минин | Павел Попов | Компьютер | 5 | 15 000 | на рассмотрении |
159172 | Микрошкин | Сергей Минин | Павел Попов | Тех. сопровождение | 2 | 2 300 | в ожидании |
346287 | Микрошкин | Сергей Минин | Павел Попов | Софт | 4 | 46 900 | на рассмотрении |
170247 | Кружка и ложка | Виктор Юдин | Павел Попов | Тех. сопровождение | 1 | 14 800 | выигран |
769790 | Кружка и ложка | Виктор Юдин | Павел Попов | Компьютер | 1 | 47 500 | выигран |
106612 | Кружка и ложка | Виктор Юдин | Павел Попов | Компьютер | 5 | 36 400 | отменен |
151606 | Кружка и ложка | Виктор Юдин | Павел Попов | Монитор | 4 | 9 300 | на рассмотрении |
Сохраните таблицу в Excel файл, вставив начиная с ячейки А1, а также назовите лист «База». Сохраните файл с названием «Отчет по аукционам.xlsx».
Итак сначала давайте прочитаем данные из Excel файла, создадим Pandas Dataframe и передадим туда данные:
import pandas as pd
import numpy as np
data_pd=pd.read_excel(‘Отчет по аукционам.xlsx’,sheet_names=’База’)
Сводная таблица в Python
Cоздать сводную таблицу в Python при помощи пакета Pandas очень просто. К примеру давайте создадим сводную таблицу по столбцу Контрагент:
data_pt = pd.pivot_table(data_pd,index=[‘Контрагент’])
Откройте файл result.xlsx, который скрипт создал в той же папке, где он располагается. Результат должен быть следующего вида:
Мы можем создать сводную таблицу по нескольким индексируемым столбцам:
data_pt = pd.pivot_table(data_pd,index=[‘Контрагент’, ‘Контакт’, ‘Менеджер’])
По умолчанию сводная таблица выводится по всем числовым полям, однако это не всегда удобно, а иногда и лишено смысла, поэтому можно выводить сводные данные только по отдельным столбцам. Для примера выведем только столбец «Стоимость», для этого добавим параметр values=[‘Стоимость’]:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’])
Столбец стоимость по умолчанию выводит среднее значение, однако нам скорее интересна сумма продаж. Добавляем параметр aggfunc=np.sum:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’], aggfunc=np.sum)
С помощью aggfunc можно выводить несколько значений, к примеру средную стоимость и количество продаж:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’], aggfunc=[np.mean,len])
Также как в Excel, в Pandas индексируемые параметры можно выводить не только в строки, но и в столбцы, для этого служит параметр columns. Например выведем в столбцы наименование продуктов:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’], columns=[‘Продукт’], aggfunc=np.sum)
Наверное вы обратили внимание, что в ячейках, где нет данных пусто, хотя нам привычнее, что бы в таких полях указывалось бы значение 0. Добавим параметр fill_value=0:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’], columns=[‘Продукт’], aggfunc=np.sum ,fill_value=0)
Вероятно полезно было бы рассматривать эффективность деятельности наших менеджеров не только по стоимости продаж, но и по их количеству.
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’], values=[‘Стоимость’, ‘Количество’], columns=[‘Продукт’], aggfunc=np.sum ,fill_value=0)
Как и в Excel, мы можем перемещать индексируемые поля между столбцами и строками. К примеру перенесем «Продукт» из столбцов в строки:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’, ‘Продукт’], values=[‘Стоимость’, ‘Количество’], aggfunc=np.sum ,fill_value=0)
Если нужно добавить итоговую строчку в таблицу, то за это отвечает параметр margins=True:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Контакт’, ‘Продукт’], values=[‘Стоимость’, ‘Количество’], aggfunc=[np.sum,np.mean],fill_value=0,margins=True)
Как мы помним исходной таблице у нас есть столбец «Статус», которому мы присвоили тип категория. Давайте проанализируем работу наших менеджеров этому параметру. Обратите внимание на то, что статусы выводятся именно в том порядке, что мы определили выше:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Статус’], values=[‘Стоимость’], aggfunc=[np.sum],fill_value=0,margins=True)
Еще одной очень удобной функцией в сводных таблицах Pandas является то, что для каждого типа значений можно выбирать, какую функцию к ним применить. К примеру для «Количество» мы хотим отражать количество продаж, а для «Стоимость» — сумму продаж:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Статус’], values=[‘Количество’, ‘Стоимость’], columns=[‘Продукт’], aggfunc=<'Количество':len, 'Стоимость':np.sum>,fill_value=0)
Также для отдельного значения мы можем использовать несколько агригирующих функций:
data_pt = pd.pivot_table(data_pd,index=[‘Менеджер’, ‘Статус’], values=[‘Количество’, ‘Стоимость’], columns=[‘Продукт’], aggfunc=<'Количество':len, 'Стоимость':[np.sum,np.mean]>,fill_value=0)
Также мы можем фильтровать данные, выводя только те записи, которые нам интересны. К примеру выведем продажи только менеджера «Илья Сергеев»:
data_pt = data_pt.query(‘Менеджер == [«Илья Сергеев»]’)
Или к примеру мы можем вывести только те продажи, у которых статус «выигран» или «в ожидании»:
Источник