Использование разреженных структур в Pandas

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

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

Введение

В этом практическом занятии вы научитесь использовать разреженные структуры данных в библиотеке pandas. Это полезно в ситуациях, когда у нас есть большие объемы данных, большинство из которых похожи (например, равны нулю или представляют собой NaN), и поэтому могут быть представлены более эффективно в памяти. Мы узнаем о SparseArray, SparseDtype, разреженном доступаторе, разреженных вычислениях и взаимодействии с разреженными матрицами scipy.

Советы по использованию ВМ

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

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Создание SparseArray

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

## Importing necessary libraries
import pandas as pd
import numpy as np

## Creating a numpy array with random values
arr = np.random.randn(10)

## Setting some values to NaN
arr[2:-2] = np.nan

## Creating a sparse array with pandas
ts = pd.Series(pd.arrays.SparseArray(arr))

## Output the sparse array
print(ts)

Проверка эффективности использования памяти

Далее мы проверим эффективность использования памяти при работе с разреженными структурами данных. Создадим большой DataFrame, преобразуем его в разреженный и сравним объем памяти, занимаемый обоими вариантами.

## Creating a large DataFrame with random values
df = pd.DataFrame(np.random.randn(10000, 4))

## Setting majority of the DataFrame to NaN
df.iloc[:9998] = np.nan

## Converting the DataFrame to sparse
sdf = df.astype(pd.SparseDtype("float", np.nan))

## Checking memory usage of dense vs sparse DataFrame
print('dense : {:0.2f} bytes'.format(df.memory_usage().sum() / 1e3))
print('sparse: {:0.2f} bytes'.format(sdf.memory_usage().sum() / 1e3))

Понимание SparseDtype

SparseDtype хранит тип данных (dtype) неразреженных значений и скалярное значение-заполнитель. Его можно создать, передав только dtype, или также явное значение-заполнитель.

## Creating a SparseDtype
print(pd.SparseDtype(np.dtype('datetime64[ns]')))

## Creating a SparseDtype with an explicit fill value
print(pd.SparseDtype(np.dtype('datetime64[ns]'), fill_value=pd.Timestamp('2017-01-01')))

Использование разреженного доступатора

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

## Creating a Series with sparse values
s = pd.Series([0, 0, 1, 2], dtype="Sparse[int]")

## Using the sparse accessor
print(s.sparse.density)
print(s.sparse.fill_value)

Выполнение разреженных вычислений

Мы можем применить универсальные функции NumPy к SparseArray и получить в результате SparseArray.

## Creating a SparseArray
arr = pd.arrays.SparseArray([1., np.nan, np.nan, -2., np.nan])

## Applying a NumPy ufunc
print(np.abs(arr))

Преобразование между разреженными и плотными представлениями

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

## Converting from sparse to dense
print(sdf.sparse.to_dense())

## Converting from dense to sparse
dense = pd.DataFrame({"A": [1, 0, 0, 1]})
dtype = pd.SparseDtype(int, fill_value=0)
print(dense.astype(dtype))

Взаимодействие с разреженными матрицами scipy

Наконец, мы можем создать DataFrame с разреженными значениями из разреженной матрицы scipy, и наоборот.

## Importing necessary libraries
from scipy.sparse import csr_matrix

## Creating a sparse matrix with scipy
arr = np.random.random(size=(1000, 5))
arr[arr <.9] = 0
sp_arr = csr_matrix(arr)

## Creating a DataFrame from the sparse matrix
sdf = pd.DataFrame.sparse.from_spmatrix(sp_arr)

## Printing the DataFrame
print(sdf.head())
print(sdf.dtypes)

## Converting back to sparse matrix
print(sdf.sparse.to_coo())

Резюме

В этом практическом занятии мы научились использовать разреженные структуры данных в pandas для экономии памяти при хранении и вычислениях. Мы использовали SparseArray, SparseDtype и выполняли разреженные вычисления. Также мы узнали, как преобразовывать между плотными и разреженными представлениями и как взаимодействовать с разреженными матрицами scipy.