Skip to content

Продвинутый Pandas: исчерпывающее руководство для энтузиастов данных

Пересказ статьи RaviTeja G. Advanced Pandas: A Comprehensive Handbook for Data Enthusiasts


Это вторая часть нашего руководства по науке о данных с Pandas. В части 1 мы заложили основы изучения структур данных, загрузки данных, очистки, выборки, индексации и манипуляции данными. Однако исследование данных на этом не заканчивается, правильно?

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

Содержание


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

    • 1.1 Группировка данных

    • 1.2 Агрегатные функции

    • 1.3 Сводные таблицы и перекрестная табуляция

  2. Визуализация данных

    • 2.1 Поиск корреляции

    • 2.2 Сортировка данных и создание базовых графиков

  3. Обработка данных временных рядов

    • 3.1 Работа с данными даты/времени

    • 3.2 Передискретизация и сдвиг

    • 3.3 Скользящая статистика

  4. Обработка категориальных данных

    • 4.1 Кодировка категориальных переменных

    • 4.2 Сортировка порядковых данных

  5. Продвинутые темы

    • 5.1 Поэлементные операции, использующие eval

    • 5.2 Продвинутые операции фильтрации, использующие query

    • 5.3 Мультииндексирование

    • 5.4 Обработка выбросов

    • 5.5 Оптимизация памяти

  6. Заключение


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


Значимые идеи никогда бы не появились без надлежащей агрегации данных, не так ли? Фактически именно для этого мы часто используем сводные таблицы в Excel. Поэтому мы можем сказать, что это критический шаг в анализе данных, который часто сопровождается применением агрегатных функций типа sum, mean, count и т.п. для группировки данных.

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


groupby с единственным столбцом: Этот метод позволяет группировать данные на основе одного или нескольких столбцов. Вы можете представить это как мощную версию оператора SQL GROUP BY.

Сначала вам нужно передать имя столбца, по которому вы хотите сгруппировать данные. Затем вы можете использовать сгруппированные данные и выбрать столбец, данные которого вы хотите сравнить для групп, после чего выбрать агрегатную функцию (mean, sum, max, min и т.п.).

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

Пусть, например, у нас есть данные по продажам, и вы хотите сгруппировать их по столбцу “Category” и вычислить суммарные продажи в каждой категории.

import pandas as pd
# Пример фрейма данных
data = {'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing'],
'Sales': [1000, 500, 800, 500]}
df = pd.DataFrame(data)
# Группируем по 'Category'
grouped_data = df.groupby('Category')
# Выбираем столбец продаж для сравнения сгруппированных данных с использованием функции sum
# Это дает общие продажи для каждой категории.
total_sales = grouped_data['Sales'].sum()
print(total_sales)
--------------------------------------------------------------------------
вывод:

Category
Clothing 1000
Electronics 1800
Name: Sales, dtype: int64

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

Предположим, например, что у нас имеется набор данных с информацией о студентах, включая их оценки по разным предметам, и вы хотите сгруппировать данные по обеим столбцам “Class” и “Gender”, с последующим вычислением статистики, такой как средний, минимальный и максимальный балл по математике.

import pandas as pd
# Пример фрейма данных
data = {'Class': ['A', 'B', 'A', 'B', 'A', 'B'],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male', 'Female'],
'Math_Score': [85, 92, 78, 89, 90, 86],
'English_Score': [88, 94, 80, 92, 92, 88]}
df = pd.DataFrame(data)
# Группируем по 'Class' и 'Gender' и вычисляем статистику
grouped_data = df.groupby(['Class', 'Gender'])
# Вычисляем средние баллы для Math_score
agg_results = grouped_data['Math_Score'].mean()
print(agg_results)
--------------------------------------------------------------------
вывод:

Math_Score
Class Gender
A Female 86.000000
Male 87.500000
B Female 87.000000
Male 92.000000

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

import pandas as pd
# Пример фрейма данных
data = {'Class': ['A', 'B', 'A', 'B', 'A', 'B'],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male', 'Female'],
'Math_Score': [85, 92, 78, 89, 90, 86],
'English_Score': [88, 94, 80, 92, 92, 88]}
df = pd.DataFrame(data)
# Группируем по 'Class' и 'Gender'
grouped_data = df.groupby(['Class', 'Gender'])
# Применение агрегатной функции mean ко всем числовым столбцам
aggregated_data = grouped_data.mean()
print(aggregated_data)
----------------------------------------------------------------------
вывод:

Math_Score English_Score
Class Gender
A Female 82.000000 84.000000
Male 87.500000 90.000000
B Female 87.500000 90.000000
Male 92.000000 94.000000

Агрегатные функции


Функции агрегирования необходимы для суммирования данных внутри групп. Обычными агрегатными функциями являются sum(), max(), min(), mean(), median(), count(); agg() - эта функция позволяет применять пользовательские агрегатные функции.

Пусть, например, мы хотим одновременно применить несколько агрегатных функций (mean, min и max) к Math Score. Мы также хотим проверить эти несколько агрегатных функций для двух предметов (т.е. для нескольких столбцов).

import pandas as pd
# Пример фрейма данных
data = {'Class': ['A', 'B', 'A', 'B', 'A', 'B'],
'Gender': ['Male', 'Male', 'Female', 'Female', 'Male', 'Female'],
'Math_Score': [85, 92, 78, 89, 90, 86],
'English_Score': [88, 94, 80, 92, 92, 88],
'Physics_Score': [78, 90, 85, 92, 88, 84]}
df = pd.DataFrame(data)
# Группируем по 'Class' и 'Gender' и вычисляем статистику
grouped_data = df.groupby(['Class', 'Gender'])
# Вычисляем средние, минимальные и максимальные баллы Math_score
agg_results = grouped_data.Math_Score.agg(['mean', 'min', 'max'])
print(agg_results)
# Применяем агрегатные функции к 'Math_Score' и 'Physics_Score'
aggregated_data = grouped_data.agg({
'Math_Score': ['mean', 'min', 'max'],
'Physics_Score': ['mean', 'min', 'max']
})
print(aggregated_data)
----------------------------------------------------------------------
вывод:

mean min max
Class Gender
A Female 78.0 78 78
Male 87.5 85 90
B Female 87.5 86 89
Male 92.0 92 92
-----------------------------------------------------------------------
Math_Score Physics_Score
mean min max mean min max
Class Gender
A Female 82.000000 78 86 81.500000 78 85
Male 87.500000 85 90 83.000000 78 88
B Female 87.500000 86 89 88.000000 85 92
Male 92.000000 92 92 91.000000 88 92

Сводные таблицы и перекрестная табуляция


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

  • Мы можем использовать pd.pivot_table для создания сводных таблиц

  • Перекрестные таблицы (crosstabs) - еще один метод агрегации данных, особенно при работе с категориальными переменными, используя pd.crosstab.

import pandas as pd
# Пример фрейма данных с данными продаж
data = {'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing'],
'Region': ['North', 'South', 'North', 'South'],
'Sales': [1000, 500, 800, 750],
'Profit': [150, 50, 120, 100]}
df = pd.DataFrame(data)
# Сводная таблица: сумма продаж по категориям и регионам
pivot_table = pd.pivot_table(df, index='Category', columns='Region', values='Sales', aggfunc='sum')
# Перекрестная табуляция: число категорий по регионам
cross_tab = pd.crosstab(df['Category'], df['Region'])
print("Pivot Table:")
print(pivot_table)
print("\nCross-Tabulation:")
print(cross_tab)
----------------------------------------------------------------------
Pivot Table:
Region North South
Category
Clothing NaN 1250
Electronics 1800 NaN

Cross-Tabulation:
Region North South
Category
Clothing 0 2
Electronics 2 0

2. Визуализация данных


Визуализация данных - это мощный способ для изучения и обмена информацией на основе ваших данных.

2.1 Поиск корреляции


Корреляция - это то, как одна переменная связана с другими переменными. Чтобы получить корреляцию каждого столбца с каждым другим столбцом, вы можете использовать .corr(); числа близкие к +1 показывают высокую положительную корреляцию, а числа близкие к -1 говорят о высокой отрицательной корреляции.

2.2 Сортировка данных и создание основных графиков


  • .sort_values(): Используйте этот метод для сортировки рядов или фреймов данных. Вы можете использовать параметр by для указания столбца, по которому выполнять сортировку, и использовать параметр ascending для задания возрастающего или убывающего порядка сортировки.

  • Вот несколько графиков, которые вы можете построить с помощью pandas. В параметрах x и y вы можете указать ряды, для которых хотите построить графики.

1. Линейный график: df.plot(x='X', y='Y', kind='line')
2. Гистограмма: df.plot(x='Category', y='Count', kind='bar')
3. График Барха (горизонтальная полоса): df.plot(x='Count', y='Category', kind='barh')
4. Гисторгамма: df['Value'].plot(kind='hist', bins=20)
5. Ящичный график: df.plot(y='Value', kind='box')
6. График площади: df.plot(x='X', y='Y', kind='area')
7. Точечная диаграмма: df.plot(x='X', y='Y', kind='scatter')
8. Круговая диаграмма: df['Category'].value_counts().plot(kind='pie')
9. Шестнадцатеричный график: df.plot(x='X', y='Y', kind='hexbin', gridsize=20)
10. Столбчатый график с накоплением: df.pivot_table(index='Category', columns='Subcategory', values='Value', aggfunc='sum').plot(kind='bar', stacked=True)
11. Линейный график с несколькими линиями: df.plot(x=’Date’,y=[‘Series1’,’Series2'],kind=’line’)

Продвинутые графики:
1. График KDE (оценка плотности ядра): df['Value'].plot(kind='kde')
2. График плотности: df['Value'].plot(kind='density')
3. График Боксена: df.plot(y='Value', kind='boxen')

3. Обработка данных временных рядов


Данные временных рядов состоят из точек данных, собранных или записанных в заданные интервалы времени.

3.1 Работа с данными даты/времени


Данные даты/времени существенны для анализа временных рядов. С pandas нам больше не нужно беспокоиться об этом анализе, поскольку эта библиотека обеспечивает надежную поддержку работы с датами и временем.

  • pd.to_datetime: Этот метод позволяет преобразовать ваши ряды даты/времени в временные ряды pandas, посредством которых вы сможете более просто выполнять анализ. Вы можете получить год, месяц, день и часы.

    import pandas as pd
    # Пример фрейма данных со столбцом DateTime
    data = {'DateTime': ['2023-01-01 08:30:00', '2023-02-01 14:45:00', '2023-03-01 20:15:00']}
    df = pd.DataFrame(data)
    # Преобразуем столбец 'DateTime' в DateTime
    df['DateTime'] = pd.to_datetime(df['DateTime'])
    # Извлекаем год, месяц, день и час
    df['Year'] = df['DateTime'].dt.year
    df['Month'] = df['DateTime'].dt.month
    df['Day'] = df['DateTime'].dt.day
    df['Hour'] = df['DateTime'].dt.hour
    print(df)

3.2 Передискретизация и сдвиг


Передискретизация - это процесс изменения частоты ваших данных временных рядов. Он позволяет агрегировать или трансформировать данные из одной временной частоты в другую. Основными причинами передискретизации являются:

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

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

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

import pandas as pd
# Пример фрейма данных с ежедневными данными продаж
data = {'Date': pd.date_range(start='2023-01-01', periods=40, freq='D'),
'Sales': [i for i in range(40)]}
df = pd.DataFrame(data)
# Изменяем частоту дискретизации на помесячную, вычисляя сумму продаж
monthly_sales = df.resample('M', on='Date').sum()
print(monthly_sales)

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

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

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

Пример. Мы вычислим изменения цены за день, вычитанием цены предыдущего дня из цены текущего дня.

import pandas as pd
# Пример фрейма данных с ценами акций по дням
data = {'Date': pd.date_range(start='2023-01-01', periods=5, freq='D'),
'Price': [100, 105, 110, 108, 112]}
df = pd.DataFrame(data)
# Вычисляем ежедневные изменения цены (временной лаг 1 день)
df['Price_Change'] = df['Price'] - df['Price'].shift(1)
df
-------------------------------------------------------------------
вывод:

Date Price Price_Change
0 2023-01-01 100 NaN
1 2023-01-02 105 5.0
2 2023-01-03 110 5.0
3 2023-01-04 108 -2.0
4 2023-01-05 112 4.0

3.3 Скользящая статистика


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

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

  • Размер окна: скользящее окно имеет фиксированный размер, который задаете вы. Этот размер определяет количество точек, участвующих в каждом вычислении. Например, окно размером 3 означает, что вы рассматриваете текущую точку данных и две предыдущих точки в каждом вычислении.

  • Скользящая функция: вы применяете конкретную функцию к данным в пределах скользящего окна. Обычными функциями являются среднее, сумма, стандартное отклонение, и т.п.

Пример. В этом примере рассчитывается среднее значение для окна размером 3. Это означает, что каждой ячейки вычисляется среднее значение текущей точки данных и двух предыдущих.

import pandas as pd
# Пример фрейма данных с ежедневными ценами на акции
data = {'Date': pd.date_range(start='2023-01-01', periods=10, freq='D'),
'Price': [100, 105, 110, 108, 112, 115, 118, 120, 122, 125]}
df = pd.DataFrame(data)
# Вычисляем 3-х дневное скользящее среднее (moving average) цен
df['Rolling_Mean'] = df['Price'].rolling(window=3).mean()
df
---------------------------------------------------------------
вывод:

Date Price Rolling_Mean
0 2023-01-01 100 NaN
1 2023-01-02 105 NaN
2 2023-01-03 110 105.000000
3 2023-01-04 108 107.666667
4 2023-01-05 112 110.000000
5 2023-01-06 115 111.666667
6 2023-01-07 118 115.000000
7 2023-01-08 120 117.666667
8 2023-01-09 122 120.000000
9 2023-01-10 125 122.333333

4. Обработка категориальных данных


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

Кодировка категориальных переменных


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

  • Горячее кодирование (One-Hot Encoding), использующее pd.get_dummies: горячее кодирование создает бинарные столбцы (нули и единицы) для каждой категории, указывающие присутствие (единицы) или отсутствие (нули) категории для каждой точки данных. Если в столбце имеется k уникальных значений, будет создано k новых бинарных столбцов по одному на каждое значение. Но недостатком является то, что при этом удаляется исходный столбец!
    import pandas as pd
    # Пример фрейма данных со столбцом категорий
    data = {'Category': ['A', 'B', 'A', 'C', 'B'],
    'Count':[1,2,3,4,5]}
    df = pd.DataFrame(data)
    # Выполняет горячее кодирование
    encoded_df = pd.get_dummies(df, columns=['Category'])
    print(encoded_df)
    --------------------------------------------------------------------
    вывод: Видим, что исходный столбец отсутствует!

    Count Category_A Category_B Category_C
    0 1 1 0 0
    1 2 0 1 0
    2 3 1 0 0
    3 4 0 0 1
    4 5 0 1 0

  • Кодирование меток (Label encoding): Скажем, у нас имеется 100 уникальных значений в столбце категорий. Тогда, если использовать горячую кодировку, будет создано 100 новых столбцов! Если мы не хотим подобного наполнения данными, у нас есть другой подход, при котором уникальное числовое значение присваивается каждой категории. Метод .astype('category').cat.codes используется для конвертации категориальных столбцов в кодирование меток.
    import pandas as pd
    # Пример фрейма данных со столбцом категорий
    data = {'Category': ['A', 'B', 'A', 'C', 'B']}
    df = pd.DataFrame(data)
    # Выполняем кодирование меток
    df['Category_Encoded'] = df['Category'].astype('category').cat.codes
    print(df)
    -----------------------------------------------------------------
    вывод:

    Category Category_Encoded
    0 A 0
    1 B 1
    2 A 0
    3 C 2
    4 B 1

4.2 Сортировка порядковых данных


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

Мы можем получить такую сортировку, конвертировав столбец Ordinal в столбец категорий Pandas с помощью pd.Categorical() и задав параметры categories=ordinal_order и ordered=True. Давайте сообщим Pandas, что столбец “Size” следует считать порядковыми данными с указанным порядком.

Например, предположим, что у нас есть фрейм данных с порядковым столбцом, который называется “Size”, и вы хотите выполнить сортировку в значимом порядке: использование sort_values тут выполнит сортировку в алфавитном порядке, чего мы не ожидали!

import pandas as pd
# Пример фрейма данных с порядковым столбцом
data = {'Product': ['Product A', 'Product B', 'Product C', 'Product D'],
'Size': ['Medium', 'Small', 'Large', 'Medium']}
df = pd.DataFrame(data)
# Определяем пользовательский порядок
ordinal_order = ['Small', 'Medium', 'Large']
# До сортировки
print('Noraml Sorting:')
print(df.sort_values(by='Size'))
# Сортируем фрейм данных по столбцу 'Size'
df['Size'] = pd.Categorical(df['Size'], categories=ordinal_order, ordered=True)
print('Ordinal Sorting:')
print(df.sort_values(by='Size'))
----------------------------------------------------------------------
вывод:
Обычная сортировка:
Product Size
2 Product C Large
0 Product A Medium
3 Product D Medium
1 Product B Small

Порядковая сортировка:
Product Size
1 Product B Small
0 Product A Medium
3 Product D Medium
2 Product C Large

5. Продвинутые темы


В этом разделе мы познакомимся с продвинутыми методами и рекомендациями по работе с Pandas, которые наиболее полезны при работе с большими наборами и сложными структурами данных.

5.1 Поэлементные операции с использованием eval


eval(): метод eval() в Pandas позволяет выполнять эффективные поэлементные операции на фрейме данных, используя строковые выражения. Это особенно полезно для больших фреймов данных и сложных операций.

Пример. Мы используем eval() для создания нового столбца 'C', выполняя поэлементное сложение столбцов 'A' и 'B'. Параметр inplace=True обновляет фрейм данных на месте.

# Пример фрейма данных
import pandas as pd
data = {'A': [1, 2, 3, 4],
'B': [10, 20, 30, 40]}
df = pd.DataFrame(data)
# Использование eval для создания нового столбца C
df.eval('C = A + B', inplace=True)
# Вычисляем новый столбец 'D', используя сложное выражение
df.eval('D = (A * 2) + (B / 3)', inplace=True)

5.2 Продвинутые операции фильтра с использованием query


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

Пример. В этом примере мы используем query() для фильтрации строк, у которых 'Age' больше 30.

# Пример фрейма данных
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# Использовнаие query для фильтрации строк
filtered_df = df.query('Age > 30')
# Использование query для фильтрации по нескольким условиям
filtered_df = df.query('(Age > 30) and (Salary > 60000)')

Оба метода eval() и query() предназначены для улучшения производительности при работе с большими фреймами данных и сложными операциями.

5.3 Мультииндексация


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

import pandas as pd
# Простой иерархический фрейм данных
data = {'Department': ['HR', 'HR', 'Engineering', 'Engineering'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David'],
'Salary': [60_000, 65_000, 80_000, 75_000]}
df = pd.DataFrame(data)
# Создаем иерархический индекс
hierarchical_df = df.set_index(['Department', 'Employee'])
# Доступ к данным
print(hierarchical_df.loc[('HR','Bob')]) # Доступ к данным Bob в отделе HR

5.4 Обработка выбросов


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

  • Идентификация выбросов: К счастью, теперь вы знаете, как построить коробчатую диаграмму (из части 1) и мы можем использовать ее для визуализации выбросов. Коробка на графике представляет собой межквартильный размах (IQR), который является диапазоном между первой квартилью (Q1) и третьей квартилью (Q3) данных. Длина коробки показывает разброс средних 50% данных.

    "Бакенбарды" (“whiskers”) - это линии, расходящиеся от краев коробки. Они представляют собой диапазон данных, находящихся на определенном расстоянии от квартилей. Обычно это 1.5 IQR. Любые данные вне этого диапазона считаются потенциальными выбросами.

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

    # Создаем пример фрейма данных
    data = {'Values': [25, 30, 200, 40, 20, 300, 35, 45, 30]}
    df = pd.DataFrame(data)
    # Коробочная диаграмма для визуализации выбросов
    df.boxplot(column='Values')

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

    threshold = 100  # Определяем пороговое значение для выбросов
    df['Values'][df['Values'] > threshold] = None # Заменяем выбросы на NaN

  • Обработка выбросов с помощью значений обрезки (clip). Обрезка — это процесс установки верхней и нижней границ переменной, которые ограничивают экстремальные значения заданным диапазоном. Это может оказаться полезным для уменьшения воздействия выбросов без удаления их полностью из набора данных. Она заменяет значения в фрейме данных заданными границами, если выбросы выпадают из заданного диапазона.

Пример. Здесь значения 200, 300 и -100 являются выбросами. Поэтому после установки диапазона с помощью верхней и нижней границ мы можем передать их функции clip. Любые значения выше верзней границы будут заменяться значением верхней границы, соответственно значение нижней границы будет использовано для значений, меньших нижней границы. Таким образом, 200 и 300 будут заменяться на 100, а -100 - на 0.

# Создаем пример фрейма данных
data = {'Values': [25, 30, 200, 40, 20, 300, 35, 45, -100]}
df = pd.DataFrame(data)
# Определяем верхнюю и нижнюю границы
lower_bound = 0
upper_bound = 100
# Обрезаем значения по заданным границам
df['Values'] = df['Values'].clip(lower=lower_bound, upper=upper_bound)
df
----------------------------------------------------------------------
вывод:
Values
0 25
1 30
2 100
3 40
4 20
5 100
6 35
7 45
8 0

5.5 Оптимизация памяти


Оптимизация памяти всегда полезна, не так ли? Однако она критична при работе с большими наборами данных. Pandas предоставляет методы для сокращения потребления памяти, поддерживая при этом целостность данных.

  1. Выбор правильных типов данных:
    - Используйте подходящие типы данных для столбцов. Например, используйте int8 или int16 для целочисленных столбцов с небольшим диапазоном значений, и float32 для столбцов с плавающей точкой.
    - Рассмотрите возможность использования категориальных типов данных для столбцов с ограниченным числом уникальных значений. Это уменьшит использования памяти и сможет улучшить производительность при работе с категориальными данными.

  2. Используйте разреженные (Sparse) структуры данных, если ваши данные содержат слишком много отсутствующих значений:
    - Pandas поддерживает структуры разреженных данных, таких как SparseDataFrame и SparseSeries, которые подходят для наборов данных с множеством отсутствующих значений.
    - Разреженные структуры данных хранят только действительные значения, уменьшая использование памяти.

  3. Читайте данные частями:
    - При чтении больших наборов данных из внешних источников используйте параметр chunksize в функции типа read_csv(), чтобы читать данные небольшими порциями, а не загружать сразу весь набор данных в память.

  4. Оптимизируйте операции GroupBy:
    - Используйте параметр as_index=False при выполнении операций GroupBy, чтобы избежать создания нового индекса, который может потреблять дополнительную память.

  5. Освобождайте ненужные фреймы данных (DataFrames):
    - Явным образом освобождайте память, удаляя фреймы данных или ряды, которые больше не нужны, используя ключевое слово del. Это освободит память для других операций.

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

Ссылки по теме
1. От SQL к Pandas: руководство по переходу
2. Команды Pandas, которые я часто использую для анализа данных

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.