Pandas 에서 희소 구조 사용하기

Beginner

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

소개

이 랩에서는 pandas 라이브러리에서 희소 데이터 구조를 사용하는 방법을 안내합니다. 이는 대부분의 데이터가 유사한 값 (예: 0 또는 NaN) 으로 구성되어 메모리에서 더 효율적으로 표현할 수 있는 대용량 데이터를 다루는 시나리오에서 유용합니다. SparseArray, SparseDtype, 희소 접근자 (sparse accessor), 희소 계산 및 scipy 희소 행렬과의 상호 작용에 대해 배우게 됩니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 접근하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 신속하게 해결해 드리겠습니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 71%의 긍정적인 리뷰율을 받았습니다.

희소 배열 생성

먼저, 희소 값을 효율적으로 저장하기 위한 pandas 데이터 구조인 희소 배열 (SparseArray) 을 생성합니다. 희소 값은 대부분의 값과 유사하여 중복으로 간주되므로 저장되지 않는 값입니다.

## 필요한 라이브러리 임포트
import pandas as pd
import numpy as np

## 랜덤 값으로 numpy 배열 생성
arr = np.random.randn(10)

## 일부 값을 NaN 으로 설정
arr[2:-2] = np.nan

## pandas 로 희소 배열 생성
ts = pd.Series(pd.arrays.SparseArray(arr))

## 희소 배열 출력
print(ts)

메모리 효율성 확인

다음으로, 희소 데이터 구조를 사용하는 메모리 효율성을 확인합니다. 대규모 DataFrame 을 생성하고, 이를 희소 (sparse) 로 변환한 다음 메모리 사용량을 비교합니다.

## 랜덤 값으로 대규모 DataFrame 생성
df = pd.DataFrame(np.random.randn(10000, 4))

## DataFrame 의 대부분을 NaN 으로 설정
df.iloc[:9998] = np.nan

## DataFrame 을 희소로 변환
sdf = df.astype(pd.SparseDtype("float", np.nan))

## 밀집 (dense) vs 희소 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 과 스칼라 채움 값 (fill value) 을 저장합니다. dtype 만 전달하거나, 명시적인 채움 값을 함께 전달하여 생성할 수 있습니다.

## SparseDtype 생성
print(pd.SparseDtype(np.dtype('datetime64[ns]')))

## 명시적인 채움 값을 사용하여 SparseDtype 생성
print(pd.SparseDtype(np.dtype('datetime64[ns]'), fill_value=pd.Timestamp('2017-01-01')))

Sparse Accessor 사용

.sparse accessor 를 사용하여 희소 데이터에 특정한 속성 (attribute) 과 메서드 (method) 를 얻을 수 있습니다.

## 희소 값을 가진 Series 생성
s = pd.Series([0, 0, 1, 2], dtype="Sparse[int]")

## sparse accessor 사용
print(s.sparse.density)
print(s.sparse.fill_value)

희소 계산 수행

NumPy ufunc 을 SparseArray 에 적용하여 결과로 SparseArray 를 얻을 수 있습니다.

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

## NumPy ufunc 적용
print(np.abs(arr))

희소 데이터와 밀집 데이터 간 변환

희소 데이터에서 밀집 데이터로, 그리고 그 반대로 데이터를 쉽게 변환할 수 있습니다.

## 희소 데이터에서 밀집 데이터로 변환
print(sdf.sparse.to_dense())

## 밀집 데이터에서 희소 데이터로 변환
dense = pd.DataFrame({"A": [1, 0, 0, 1]})
dtype = pd.SparseDtype(int, fill_value=0)
print(dense.astype(dtype))

scipy sparse 와 상호 작용

마지막으로, scipy sparse 행렬에서 희소 값을 가진 DataFrame 을 생성할 수 있으며, 그 반대도 가능합니다.

## 필요한 라이브러리 임포트
from scipy.sparse import csr_matrix

## scipy 를 사용하여 희소 행렬 생성
arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)

## 희소 행렬에서 DataFrame 생성
sdf = pd.DataFrame.sparse.from_spmatrix(sp_arr)

## DataFrame 출력
print(sdf.head())
print(sdf.dtypes)

## 다시 희소 행렬로 변환
print(sdf.sparse.to_coo())

요약

이 랩에서는 메모리 효율적인 저장 및 계산을 위해 pandas 에서 희소 데이터 구조를 사용하는 방법을 배웠습니다. SparseArray, SparseDtype을 사용하고 희소 계산을 수행했습니다. 또한 밀집 데이터와 희소 데이터 간의 변환 방법과 scipy sparse 행렬과 상호 작용하는 방법을 배웠습니다.