Utiliser les structures creuses dans Pandas

PythonPythonBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire vous guidera sur la manière d'utiliser des structures de données creuses dans la bibliothèque pandas. Cela est utile dans des scénarios où nous avons de grandes volumes de données, dont la plupart sont similaires (comme zéro ou NaN), et peuvent donc être représentées plus efficacement en mémoire. Nous allons apprendre à utiliser SparseArray, SparseDtype, l'accesseur creux, les calculs creux et l'interaction avec des matrices creuses scipy.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder au Notebook Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le Notebook Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites du Notebook Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.

Création d'un SparseArray

Tout d'abord, nous créons un tableau creux, qui est une structure de données pandas pour stocker efficacement un tableau de valeurs creuses. Les valeurs creuses sont celles qui ne sont pas stockées car elles sont similaires à la majorité des valeurs et sont donc considérées comme redondantes.

## 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)

Vérification de l'efficacité mémoire

Ensuite, nous allons vérifier l'efficacité mémoire de l'utilisation de structures de données creuses. Nous allons créer un grand DataFrame, le convertir en creux, puis comparer l'utilisation de mémoire.

## 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))

Comprendre SparseDtype

Le SparseDtype stocke le dtype des valeurs non creuses et la valeur de remplissage scalaire. Nous pouvons le construire en passant uniquement un dtype, ou également une valeur de remplissage explicite.

## 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')))

Utilisation de l'accesseur creux

Nous pouvons utiliser l'accesseur .sparse pour obtenir des attributs et des méthodes spécifiques aux données creuses.

## 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)

Effectuer des calculs creux

Nous pouvons appliquer les fonctions universelles NumPy à SparseArray et obtenir un SparseArray en résultat.

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

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

Conversion entre les formats creux et dense

Nous pouvons facilement convertir les données du format creux au format dense, et vice versa.

## 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))

Interaction avec les matrices creuses de scipy

Enfin, nous pouvons créer un DataFrame avec des valeurs creuses à partir d'une matrice creuse de scipy, et vice versa.

## 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())

Sommaire

Dans ce laboratoire, nous avons appris à utiliser les structures de données creuses dans pandas pour un stockage et un calcul économes en mémoire. Nous avons utilisé SparseArray, SparseDtype et effectué des calculs creux. Nous avons également appris à convertir entre les formats dense et creux, et à interagir avec les matrices creuses de scipy.