Баннер мобильный (1) Пройти тест

Pandas

Глоссарий

28 марта 2024

Поделиться

Скопировано

Содержание

    Pandas — это библиотека Python для обработки и анализа структурированных данных, её название происходит от «panel data» («панельные данные»). Панельными данными называют информацию, полученную в результате исследований и структурированную в виде таблиц. Для работы с такими массивами данных и создан Pandas.

    Введение: работа с открытым кодом

    Pandas — это open source-библиотека, то есть ее исходный код в открытом доступе размещен на GitHub. Пользователи могут добавлять туда свой код: вносить пояснения, дополнять методы работы и обновлять разделы. Для работы потребуется компилятор (программа, которая переводит текст с языка программирования в машинный код) C/C++ и среда разработки Python. Подробный процесс установки компилятора С для разных операционных систем можно найти в документации Pandas.

    В каких профессиях понадобится библиотека?

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

    Как установить Pandas

    Пошаговая инструкция по установке библиотеки Pandas

    1. Скачать библиотеку

      На официальном сайте Pandas указан самый простой способ начать работу с библиотекой. Для этого необходимо установить Anaconda — дистрибутив (форма распространения программного обеспечения, набор библиотек или программного кода для установки программы) для Python с набором библиотек. Безопасно скачать его можно на официальном сайте.

    2. Настройка установки

      Вот несколько советов по установке Anaconda для новичков:

      — Выбирайте рекомендованные настройки, на первое время этого будет достаточно. Например, Install for: Just me (recommended).

      — Но если не поставить галочку «Add Anaconda to my PATH environment variable», то Anaconda не будет запускаться по умолчанию, каждый раз ее нужно будет запускать отдельно.

      — На вопрос: «Do you wish to initialize Anaconda3?» (Хотите ли вы инициализировать Anaconda3?) отвечайте «Да».

      — После завершения установки перезагрузите компьютер.

    3. Запуск JupyterLab

      В командной строке Anaconda запустите JupyterLab — это интерактивная среда для работы с кодом, данными и блокнотами, которая входит в пакет дистрибутива. Для этого введите jupyter-lab.

    4. Открытие блокнота

      Создайте в JupyterLab новый блокнот Python3. Для его создания надо щелкнуть на значке «+», расположенном в верхней левой части интерфейса. В появившемся меню выбрать «Python 3» для создания блокнота.

    5. Импорт библиотеки

      В первой ячейке пропишите: import pandas as pd, после этого в следующих ячейках можно писать код.

    DataFrame и Series

    Чтобы начать анализировать данные с помощью Pandas, нужно понять, как устроены структуры этих данных внутри библиотеки. В первую очередь разберем, что такое DataFrame и Series.

    Series

    Pandas Series (серия) — это одномерный массив. Визуально он похож на пронумерованный список: слева в колонке находятся индексы элементов, а справа — сами элементы.

    my_series = pd.Series([5, 6, 7, 8, 9, 10])
    Pandas Series пример массива

    Индексом может быть числовой показатель (0, 1, 2…), буквенные значения (a, b, c…) или другие данные, выбранные программистом. Если особое значение не задано, то числовые индексы проставляются автоматически. Например, от 0 до 5 как в примере выше.

    Такая нумерация называется RangeIndex, в ней всегда содержатся числа от 0 до определенного числа N, которое обозначает количество элементов в серии. Собственные значения индексов задаются в квадратных скобках через index, как в примере ниже:

    my_series2 = pd.Series([5, 6, 7, 8, 9, 10]), index=['a', 'b', 'c', 'd', 'e', 'f'])
    Собственные значения индексов в Pandas

    Индексы помогают обращаться к элементам серии и менять их значения. Например, чтобы в нашей серии [5, 6, 7, 8, 9, 10] заменить значения некоторых элементов на 0, мы прописываем индексы нужных элементов и указываем, что они равны нулю:

    my_series2[['a', 'b', 'f']] = 0

    Можно сделать выборку по нескольким индексам, чтобы ненужные элементы в серии не отображались:

    my_series2[['a', 'b', 'f']]

    Результат:

    a 5
    
    b 6
    
    f 10
    
    dtype: int64

    DataFrame

    Pandas DataFrame — это двумерный массив, похожий на таблицу/лист Excel (кстати, данные из табличных файлов Excel можно читать с помощью команды pandas.read_excel('file.xls')). В нем можно проводить такие же манипуляции с данными: объединять в группы, сортировать по определенному признаку, производить вычисления. Как любая таблица, датафрейм состоит из столбцов и строк, причем столбцами будут уже известные объекты — Series.

    Чтобы проверить, действительно ли серии — это части датафрейма, можно извлечь любую колонку из таблицы. Возьмем набор данных о нескольких странах СНГ, их площади и населении и выберем колонку country:

    df = pd.DataFrame({
    'country': ['Kazakhstan', 'Russia', 'Belarus', 'Ukraine'],
    'population': [17.04, 143.5, 9.5, 45.5],
    'square': [2724902, 17125191, 207600, 603628]
    })
    Pandas DataFrame пример

    В итоге получится простая серия, в которой сохранятся те же индексы по строкам, что и в исходном датафрейме:

    df['country']
    type(df['country'])
    Pandas DataFrame индексы по строкам

    Кроме этого, у датафрейма есть индексы по столбцам, которые задаются вручную. Для простоты написания кода обозначим страны индексами из двух символов: Kazakhstan — KZ, Russia — RU и так далее:

    # Создаем датафрейм с заданными индексами
    df = pd.DataFrame({
        'country': ['Kazakhstan', 'Russia', 'Belarus', 'Ukraine'],
        'population': [17.04, 143.5, 9.5, 45.5],
        'square': [2724902, 17125191, 207600, 603628]
    }, index=['KZ', 'RU', 'BY', 'UA'])

    Результат:

    Pandas пример индекса по строкам
    # Изменяем индексы
    df.index = ['KZ', 'RU', 'BY', 'UA']
    df.index.name = 'Country Code'

    По индексам можно искать объекты и делать выборку, как в Series. Возьмем тот же датафрейм и сделаем выборку по индексам KZ, RU и колонке population методом .loc (в случае .loc мы используем квадратные скобки, а не круглые, как с другими методами), чтобы сравнить население двух стран:

    df.loc[['KZ', 'RU'], 'population']

    Anaconda выведет следующее:

    Country Code
    KZ 17.04
    RU 143.50
    Name: population, dtype: float64

    Также в DataFrame производят математические вычисления. Например, рассчитаем плотность населения каждой страны в нашем датафрейме. Данные в колонке population (численность населения) делим на square (площадь) и получаем новые данные в колонке density, которые показывают плотность населения:

    # Вычисление плотности населения
    df['density'] = df['population'] / df['square'] * 1000000
    в Pandas

    Чтение и запись данных

    В Pandas работают с форматами csv, excel, sql, html, hdf и другими. Полный список можно посмотреть с помощью метода .read, где через нижнее подчеркивание «_» будут указаны все доступные форматы.

    Ниже представлены примеры чтения и записи данных на Python с использованием Pandas:

    Чтение данных:

    1. Чтение данных из CSV файла:
    import pandas as pd
    
    # Чтение CSV файла
    data = pd.read_csv('data.csv')
    
    # Вывод первых нескольких строк датафрейма
    print(data.head())
    1. Чтение данных из Excel файла:
    # Чтение данных из Excel файла
    data = pd.read_excel('data.xlsx')
    
    # Вывод первых нескольких строк датафрейма
    print(data.head())
    1. Чтение данных из SQL базы данных:
    from sqlalchemy import create_engine
    
    # Создание подключения к базе данных
    engine = create_engine('sqlite:///database.db')
    
    # Чтение данных с помощью SQL запроса
    query = "SELECT * FROM table_name"
    data = pd.read_sql(query, engine)
    
    # Вывод первых нескольких строк датафрейма
    print(data.head())

    Запись данных:

    1. Запись данных в CSV или Exсel файл:
    # Создание датафрейма
    data = pd.DataFrame({
        'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 22]
    })
    
    # Запись в CSV файл (или Exсel, нужно будет поменять расширение ниже)
    data.to_csv('output.csv', index=False)
    1. Запись данных в SQL базу данных:
    import pandas as pd
    from sqlalchemy import create_engine
    
    # Создание датафрейма
    data = pd.DataFrame({
        'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 22]
    })
    
    # Создание подключения к базе данных
    engine = create_engine('sqlite:///new_database.db')
    
    # Запись данных в базу данных
    data.to_sql('new_table', engine, index=False, if_exists='replace')

    Доступ по индексу в DataFrame

    Для поиска данных в библиотеке Pandas используются два метода: .loc и .iloc. Рассмотрим их функциональность и применение.

    Метод .loc:

    Метод .loc предоставляет доступ к данным по заданному имени строки (индексу) в DataFrame. Рассмотрим пример с набором данных о скорости и ядовитости нескольких видов змей:

    data = {'max_speed': [1, 4, 7],
            'shield': [2, 5, 8]}
    
    index = ['cobra', 'viper', 'sidewinder']
    
    df = pd.DataFrame(data, index=index)
    
    # Вывод датафрейма
    print(df)

    Результат:

    Используя метод .loc, мы можем получить информацию о конкретном виде змеи, например, гадюке (viper):

    # Получение данных о гадюке (viper)
    viper_data = df.loc['viper']
    print(viper_data)
    метод .loc python pandas

    Метод .iloc:

    Метод .iloc позволяет осуществлять доступ к данным по порядковому номеру строки в DataFrame. Рассмотрим пример с набором данных, имеющим числовые индексы:

    mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
              {'a': 100, 'b': 200, 'c': 300, 'd': 400},
              {'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000}]
    
    df = pd.DataFrame(mydict)
    
    # Вывод датафрейма
    print(df)
          a     b     c     d
    0     1     2     3     4
    1   100   200   300   400
    2  1000  2000  3000  4000
    

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

    first_row = df.iloc[0]
    first_row
    пример использования метода iloc в Pandas

    Группировка и агрегирование данных

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

    Используем .groupby и указываем название колонки title, на основе которой Pandas объединит все данные. После этого используем метод .agregate – он поможет провести математические вычисления, то есть суммировать стоимость внутри каждой группы.

    import pandas as pd
    
    # Создание DataFrame с данными о курсах
    data = {
        'title': ['Курс A', 'Курс B', 'Курс C', 'Курс D', 'Курс E'],
        'income': [100, 150, 200, 120, 180]
    }
    
    df = pd.DataFrame(data)
    
    # Группировка данных по названию курса и агрегирование дохода
    grouped = df.groupby('title', as_index=False).aggregate({'income': 'sum'})
    
    grouped

    Обратите внимание на as_index=False, эта часть кода отвечает за то, чтобы сохранить числовые индексы в результатах группировки и вычисления.

    Сводные таблицы в Pandas

    Их используют для обобщения информации, собранной об объекте исследования. Когда исходных данных много и все они разного типа, составление таблиц помогает упорядочить информацию. Чтобы создавать на Python сводные таблицы, тоже используют библиотеку Pandas, а именно — метод .pivot_table.

    Для примера возьмем условный набор данных с простыми категориями one / two, small / large и числовыми значениями. В столбце A две категории foo / bar складываются в слово foobar — текст, который используется в программировании для условного обозначения. В этом случае он указывает, что мы делим данные на две группы по неопределенному признаку.

    df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
    "bar", "bar", "bar", "bar"],
    "B": ["one", "one", "one", "two", "two",
    "one", "one", "two", "two"],
    "C": ["small", "large", "large", "small",
    "small", "large", "small", "small",
    "large"],
    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
    "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
    df

    Результат выполнения кода:

    Python сводная таблица с помощью pandas

    С помощью метода .pivot_table преобразуем эти данные в таблицу, а в скобках прописываем условия.

    table = pd.pivot_table(df, values='D', index=['A', 'B'],
    columns=['C'], aggfunc=np.sum)
    table
    преобразованные данные в таблицу

    Мы разбиваем данные на две категории: bar и foo, в каждой из них будут подгруппы со значениями one и two, которые в свою очередь делятся на small и large. В сводной таблице мы вычисляем, сколько объектов будет в каждой группе. Для этого используем методы values, index, columns и aggfunc:

    • values — метод для агрегации, объединяет элементы в одну систему;
    • index и columns — методы, отвечающие за группировку столбцов;
    • aggfunc — метод, который передает список функций, необходимых для расчета.

    Визуализация данных в Pandas

    Дата-аналитики составляют наглядные графики с помощью Pandas и библиотеки Matplotlib — краткое руководство по работе с этим пакетом можно найти на официальном сайте. Там же есть подробная информация о доступных функциях и модулях. Связка Pandas и Matplotlib отвечает за вычислительную часть работы, а вспомогательная библиотека «создает» картинку.

    Посмотрим на данные о продажах в одной из компаний:

    Число покупок на одного покупателяКоличество покупателей
    70004
    37556
    252313
    54116
    25121
    131

    В таблице видно, что одни пользователи совершили уже более 7 000 покупок, а некоторые — сделали первую. Чтобы увидеть подробную картину, составляем график sns.distplot. На горизонтальной оси будет отображаться число покупок на одного покупателя, а на вертикальной — количество покупателей, которые совершили именно столько покупок в этой компании. Так по графику можно определить, что самой многочисленной оказалась группа клиентов, которая совершила всего несколько покупок, а группа постоянных клиентов немногочисленная.

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # Создание данных
    purchase_counts = [7000, 3755, 2523, 541, 251, 1]
    customer_counts = [4, 6, 13, 16, 21, 31]
    
    # Создание графика
    sns.set(style="whitegrid")
    sns.distplot(purchase_counts, bins=20, kde=False, hist_kws={"alpha": 0.7})
    plt.xlabel('Число покупок на одного покупателя')
    plt.ylabel('Количество покупателей')
    plt.title('Распределение числа покупок')
    plt.show()
    
    график с помощью Pandas на Python

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

    Кроме этого, в Pandas есть другие виды графиков:

    • kdeplot — график плотности распределения, который останется, если убрать гистограммы из distplot;
    • jointplot — график, показывающий распределение данных между двумя переменными. Каждая строка из набора данных в исходном файле отображается на графике как точка внутри системы координат. У точек на графике jointplot будет два заданных значения: одно по оси X, другое по оси Y.

    Например, можно отследить взаимосвязь между тем, сколько минут посетитель проводит в торговом центре и сколько магазинов успевает посетить за это время: кто-то за 30 минут успеет зайти в 5 бутиков, а кто-то обойдет 16. При этом каждый посетитель на графике будет отображаться отдельной точкой.

    Поделиться

    Скопировано

    0 комментариев

    Комментарии