Python
Pandas Crosstab: A Beginner's Guide to Effortless Analysis

Pandas Crosstab: Руководство для начинающих по простому анализу

MoeNagy Dev

Что такое pandas crosstab?

Функция crosstab() в библиотеке pandas является мощным инструментом для создания таблиц сопряженности, также известных как кросс-табуляции. Она позволяет анализировать взаимосвязь между двумя или более категориальными переменными, предоставляя табличное представление их распределения частот.

Функция crosstab() принимает на вход одну или несколько серий или категориальных переменных и генерирует двумерную таблицу, где строки представляют одну переменную, а столбцы - другую переменную. Полученная таблица показывает количество или частоту комбинаций входных переменных.

Ключевые особенности и варианты использования crosstab():

  • Анализ частоты: Определение частоты или количества различных комбинаций категориальных переменных.
  • Таблица сопряженности: Создание таблицы сопряженности для анализа взаимосвязи между двумя или более категориальными переменными.
  • Сводная таблица: Генерация вывода, похожего на сводную таблицу, который можно дополнительно настраивать и анализировать.
  • Условные вероятности: Вычисление условных вероятностей между переменными.
  • Исследование данных: Исследование распределения и взаимосвязей в вашем наборе данных.

Создание простого crosstab

Начнем с генерации примерного DataFrame для работы:

import pandas as pd
 
# Сгенерировать примерный DataFrame
data = {
    'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'],
    'Age': ['Young', 'Young', 'Old', 'Old', 'Young', 'Old'],
    'Count': [10, 8, 6, 12, 5, 9]
}
 
df = pd.DataFrame(data)

Теперь.Вот перевод на русский язык:

, мы можем использовать функцию crosstab() для создания простой сводной таблицы:

pd.crosstab(df['Пол'], df['Возраст'])

Это выведет таблицу, которая показывает количество каждой комбинации 'Пол' и 'Возраст' в DataFrame.

Возраст  Старый  Молодой
Пол
Женский     12       8
Мужской      6      15

Строки представляют переменную 'Пол', а столбцы представляют переменную 'Возраст'. Значения в таблице показывают количество каждой комбинации.

Настройка сводной таблицы

Вы можете дополнительно настроить функцию crosstab() в соответствии с вашими потребностями. Давайте рассмотрим некоторые доступные параметры.

Указание меток строк и столбцов

Вы можете предоставить пользовательские метки для строк и столбцов, используя параметры index и columns:

pd.crosstab(df['Пол'], df['Возраст'], rownames=['Пол'], colnames=['Возраст'])

Это создаст такой же вывод, как и раньше, но с пользовательскими метками строк и столбцов.

Применение функций агрегирования

По умолчанию crosstab() подсчитывает количество вхождений для каждой комбинации переменных. Вы можете изменить это поведение, применив функцию агрегирования с помощью параметра aggfunc:

pd.crosstab(df['Пол'], df['Возраст'], values=df['Количество'], aggfunc=sum)

Это создаст сводную таблицу, которая суммирует значения 'Количество' для каждой комбинации 'Пол' и 'Возраст'.

Обработка пропущенных значений

Если ваши данные содержат пропущенные значения, вы можете контролировать, как они обрабатываются, используя параметры margins и margins_name:

pd.crosstab(df['Пол'], df['Возраст'], margins=True, margins_name='Итого')

Это добавит строку и столбец 'Итого' в сводную таблицу, предоставляя общие суммы для каждой строки и столбца, включая общий итог.

Продвинутые техники сводной таблицы

Работа с многоуровневыми индексами

Функция crosstab() также может работать с многоуровневыми индексами в ваших данных. Давайте создадим образец DataFrame с многоуровневым индексом:

data = {
    ('Пол', ''): ['Мужской', 'Женский', 'Мужской', 'Женский', 'Мужской', '.Вот перевод на русский язык с сохранением комментариев к коду:
 
```python
data = {
    ('Gender', ''): ['Female', 'Female', 'Female', 'Female', 'Female', 'Female'],
    ('Age', ''): ['Young', 'Young', 'Old', 'Old', 'Young', 'Old'],
    ('Count', ''): [10, 8, 6, 12, 5, 9]
}
 
df = pd.DataFrame(data)
df.columns = pd.MultiIndex.from_tuples(df.columns)

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

pd.crosstab(df[('Gender', '')], df[('Age', '')])

Выходные данные будут иметь многоуровневый индекс как для строк, так и для столбцов, отражая структуру входных данных.

Нормализация выходных данных сводной таблицы

Вы можете нормализовать выходные данные сводной таблицы, чтобы показать относительные частоты вместо исходных значений. Это можно сделать с помощью параметра normalize:

pd.crosstab(df['Gender'], df['Age'], normalize='index')

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

Визуализация данных сводной таблицы

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

import matplotlib.pyplot as plt
 
crosstab = pd.crosstab(df['Gender'], df['Age'])
crosstab.plot(kind='bar', figsize=(8, 6))
plt.title('Сводная таблица по Полу и Возрасту')
plt.xlabel('Пол')
plt.ylabel('Количество')
plt.show()

Это создаст столбчатую диаграмму данных сводной таблицы, что может быть полезно для понимания взаимосвязей между переменными.

Фильтрация и сортировка сводной таблицы

Фильтрация сводной таблицы по критериям

Вы можете отфильтровать сводную таблицу по определенным критериям, используя стандартные методы индексации и булевой маскировки pandas:

crosstab = pd.crosstab(df['Gender'], df['Age'])
filtered_crosstab = crosstab.loc[crosstab['Young'] > 5]

Это создаст новую сводную таблицу, которая будет включать только строки, где значение в столбце 'Young' больше 5.

Сортировка строк и столбцов сводной таблицы

Чтобы отсортировать строки и столбцы сводной таблицы, вы можете использовать метод sort_index():

crosstab = pd.crosstab(df['Gender'], df['Age'])
sorted_crosstab = crosstab.sort_index()
```Вот перевод на русский язык:
 
ab = crosstab.sort_index(axis=0, ascending=False)

Это отсортирует строки crosstab в порядке убывания.

Объединение фильтрации и сортировки

Вы можете объединить фильтрацию и сортировку, чтобы дополнительно настроить вывод crosstab:

crosstab = pd.crosstab(df['Gender'], df['Age'])
filtered_sorted_crosstab = crosstab.loc[crosstab['Young'] > 5].sort_index(axis=0, ascending=False)

Это сначала отфильтрует crosstab, чтобы включить только строки, где значение столбца 'Young' больше 5, а затем отсортирует строки в порядке убывания.

Crosstabs с категориальными данными

Работа с категориальными переменными

При работе с категориальными переменными важно убедиться, что они правильно закодированы как категориальные типы данных. Вы можете использовать метод astype() для преобразования столбца в категориальный тип данных:

df['Gender'] = df['Gender'].astype('category')
df['Age'] = df['Age'].astype('category')

Отображение crosstab для категориальных признаков

После того, как вы настроили свои категориальные переменные, вы можете создать crosstab для анализа взаимосвязей между ними:

pd.crosstab(df['Gender'], df['Age'])

Это отобразит crosstab для категориальных переменных 'Gender' и 'Age'.

Обработка значений NaN в категориальных данных

Если ваши данные содержат значения NaN (отсутствующие) в категориальных переменных, вы можете обработать их, используя параметр dropna:

pd.crosstab(df['Gender'], df['Age'], dropna=False)

Это включит значения NaN в вывод crosstab, позволяя вам также проанализировать отсутствующие данные.

Crosstabs с временными рядами

Генерация crosstabs для данных, связанных со временем

Если ваши данные содержат информацию, связанную со временем, вы можете использовать функцию crosstab() для анализа взаимосвязей во времени. Давайте создадим образец DataFrame с столбцом даты:

data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06'],
    'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female']
}
df = pd.DataFrame(data)
```Вот перевод на русский язык с сохранением комментариев к коду:
 
```python
data = {
    'Date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06'],
    'Gender': ['Female', 'Male', 'Female', 'Male', 'Female', 'Male'],
    'Age': ['Молодой', 'Молодой', 'Пожилой', 'Пожилой', 'Молодой', 'Пожилой'],
    'Count': [10, 8, 6, 12, 5, 9]
}
 
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])

Теперь вы можете создать сводную таблицу, используя столбец 'Date' в качестве одной из переменных:

pd.crosstab(df['Date'].dt.date, df['Gender'])

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

Анализ тенденций и закономерностей во времени

Вы можете дополнительно проанализировать тенденции и закономерности во временной сводной таблице, используя дополнительные функции или визуализации pandas:

crosstab = pd.crosstab(df['Date'].dt.date, df['Gender'])
crosstab.plot(kind='line', figsize=(10, 6))
plt.title('Количество по полам с течением времени')
plt.xlabel('Дата')
plt.ylabel('Количество')
plt.show()

Это создаст линейный график количества по полам с течением времени, позволяя вам выявить любые тенденции или закономерности в данных.

Работа с операциями, связанными с датой/временем

При работе с данными, основанными на времени, вам может потребоваться выполнять различные операции, связанные с датой/временем, такие как группировка по году, месяцу или дню. Вы можете использовать аксессуар dt в столбце 'Date' для доступа к этим операциям:

pd.crosstab(df['Date'].dt.month, df['Gender'])

Это создаст сводную таблицу, которая показывает количество каждого пола для каждого месяца в данных.

Комбинирование сводной таблицы с другими функциями pandas

Интеграция сводной таблицы с groupby()

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

grouped_df = df.groupby(['Gender', 'Age'])
pd.crosstab(grouped_df.groups.keys(), df['Date'].dt.date)

Это создаст сводную таблицу, которая показывает количество каждой комбинации 'Gender' и 'Age' для каждой даты в данных.

Комбинирование сводной таблицы с pivot_table()

Функция crosstab() также может использоваться в сочетании с pivot_table().Вот перевод файла на русский язык с сохранением комментариев к коду:

pivot_table = pd.pivot_table(df, index=['Gender', 'Age'], columns='Date', values='Count', aggfunc='sum')

Это создаст сводную таблицу, которая показывает сумму 'Count' для каждой комбинации 'Gender' и 'Age' по разным датам.

Исследование других функций pandas для кросс-таблиц

Хотя crosstab() является мощным инструментом, существуют и другие функции pandas, которые можно использовать в сочетании или в качестве альтернативы crosstab(). Некоторые примеры:

  • value_counts(): Получение частоты уникальных значений в Series.
  • pivot(): Создание сводной таблицы в стиле электронной таблицы в виде DataFrame.
  • melt(): Распивотирование DataFrame из широкого формата в длинный формат.
  • cut() и qcut(): Разбиение непрерывных данных на интервалы.

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

Функции

Функции - это фундаментальное понятие в Python, которое позволяет вам инкапсулировать набор инструкций и использовать их повторно в вашем коде. Функции могут принимать входные параметры, выполнять некоторые операции и возвращать результат.

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

def calculate_area(length, width):
    area = length * width
    return area
 
# Вызов функции и вывод результата
result = calculate_area(5, 10)
print(f"Площадь прямоугольника составляет {result} квадратных единиц.")

В этом примере функция calculate_area() принимает два параметра, length и width, и возвращает вычисленную площадь. Затем вы можете вызвать функцию и сохранить результат в переменной result, которая затем выводится в консоль.

Функции также могут иметь параметры со значениями по умолчанию, что позволяет вызывать функцию, не предоставляя все аргументы:

def greet(name, message="Здравствуйте"):
    print(f"{message}, {name}!")
 
greet("Алиса")  # Вывод: Здравствуйте, Алиса!
greet("Боб", "Привет")  # Вывод: Привет, Боб!
```Вот перевод на русский язык:
 

Вывод: Привет, Боб!


В этом примере функция `greet()` имеет значение по умолчанию `"Hello"` для параметра `message`, поэтому вы можете вызывать функцию, указав только аргумент `name`, и она будет использовать сообщение по умолчанию.

## Модули и пакеты
Модульный дизайн Python позволяет организовывать ваш код в многократно используемые компоненты, называемые модулями. Модули - это файлы Python, содержащие функции, классы и переменные, которые можно импортировать и использовать в других частях вашего кода.

Вот пример создания простого модуля под названием `math_utils.py`:

```python
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    return a / b

Вы можете затем импортировать и использовать функции из этого модуля в другом файле Python:

import math_utils
 
result = math_utils.add(5, 3)
print(result)  # Вывод: 8
 
result = math_utils.subtract(10, 4)
print(result)  # Вывод: 6

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

Вот пример структуры пакета:

my_package/
    __init__.py
    math/
        __init__.py
        operations.py
        geometry.py
    data/
        __init__.py
        file_utils.py
        database_utils.py

В этом примере пакет my_package содержит два подпакета: math и data. Каждый подпакет имеет свой набор модулей, а файлы __init__.py позволяют Python распознавать эти каталоги как пакеты.

Вы можете затем импортировать и использовать функции из модулей внутри пакета:

from my_package.math.operations import add, subtract
from my_package.data.file_utils import read_file
 
result = add(5, 3)
print(result)  # Вывод: 8
 
data = read_file("data.txt")
print(data)

Объектно-ориентированное программирование (ООП)

Объектно-ориентированное программирование (ООП) - это парадигма программирования, которая фокусируется на создании объектов.Вот перевод на русский язык:

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

Вот пример простого класса, представляющего человека:

class Person:
    # Инициализирует объект Person с именем и возрастом
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    # Выводит приветствие с именем и возрастом
    def greet(self):
        print(f"Здравствуйте, меня зовут {self.name}, мне {self.age} лет.")
 
# Создаем объект Person и вызываем метод greet()
person = Person("Алиса", 30)
person.greet()  # Вывод: Здравствуйте, меня зовут Алиса, мне 30 лет.

В этом примере класс Person имеет два атрибута (name и age) и один метод (greet()). При создании нового объекта Person вы можете установить начальные значения для атрибутов с помощью метода __init__(), который является специальным методом, называемым конструктором.

Вы также можете создавать подклассы, которые наследуют от базового класса, позволяя расширять функциональность базового класса:

class Student(Person):
    # Инициализирует объект Student с именем, возрастом и классом
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade
 
    # Выводит сообщение о том, что студент учится в определенном классе
    def study(self):
        print(f"{self.name} учится в {self.grade} классе.")
 
# Создаем объект Student и вызываем его методы
student = Student("Боб", 15, "10-й")
student.greet()  # Вывод: Здравствуйте, меня зовут Боб, мне 15 лет.
student.study()  # Вывод: Боб учится в 10-м классе.

В этом примере класс Student наследует от класса Person и добавляет атрибут grade и метод study(). Метод __init__() класса Student вызывает метод __init__() класса Person с помощью функции super() для инициализации атрибутов name и age.

Исключения и обработка ошибок

Механизм обработки исключений в Python позволяет обрабатывать непредвиденные ситуации в вашем коде и предоставляет удобный способ работы с ошибками. Исключения возникают, когда во время выполнения программы происходит ошибка, и вы можете.Вот перевод на русский язык:

Напишите код для перехвата и обработки этих исключений.

Вот пример того, как обрабатывать исключение ZeroDivisionError:

def divide(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль не допускается.")
        return None
 
print(divide(10, 2))  # Вывод: 5.0
print(divide(10, 0))  # Вывод: Ошибка: Деление на ноль не допускается.

В этом примере функция divide() использует блок try-except для перехвата исключения ZeroDivisionError. Если операция деления вызывает это исключение, выполняется код в блоке except, и на консоль выводится сообщение. Если деление успешно, возвращается результат.

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

class NegativeNumberError(Exception):
    pass
 
def square_root(number):
    if number < 0:
        raise NegativeNumberError("Ошибка: Невозможно вычислить квадратный корень из отрицательного числа.")
    return number ** 0.5
 
try:
    print(square_root(16))  # Вывод: 4.0
    print(square_root(-4))
except NegativeNumberError as e:
    print(e)  # Вывод: Ошибка: Невозможно вычислить квадратный корень из отрицательного числа.

В этом примере функция square_root() вызывает пользовательское исключение NegativeNumberError, если входное число отрицательное. Блок try-except перехватывает это исключение и выводит сообщение об ошибке.

Заключение

В этом учебном пособии по Python вы узнали о различных концепциях среднего уровня в Python, включая функции, модули и пакеты, объектно-ориентированное программирование и обработку исключений. Эти темы важны для создания более сложных и надежных приложений на Python.

Помните, что лучший способ улучшить свои навыки Python - это практиковаться в написании кода и решении задач. Экспериментируйте с примерами, представленными в этом учебном пособии, и попытайтесь применить эти концепции к своим собственным проектам. Кроме того, продолжайте .Чтобы исследовать обширную экосистему библиотек и фреймворков Python, которые могут значительно расширить возможности ваших программ на Python.

Счастливого кодирования!

MoeNagy Dev.