Введение
В этом практическом занятии вы научитесь использовать разреженные структуры данных в библиотеке 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.