대규모 데이터 세트 확장

Beginner

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

소개

이 랩에서는 pandas 를 사용하여 데이터 분석을 더 큰 데이터 세트로 확장하는 방법에 중점을 둡니다. 적은 양의 데이터를 로드하는 방법, 효율적인 데이터 유형 사용, 청크 (chunking) 처리, Dask 와 같은 다른 라이브러리 활용과 같은 방법을 다룹니다. pandas 는 인 - 메모리 (in-memory) 분석에 더 적합하며 매우 큰 데이터 세트에는 최적의 도구가 아닐 수 있다는 점에 유의해야 합니다.

VM 팁

VM 시작이 완료되면, 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 실습을 위한 Jupyter Notebook에 액세스하십시오.

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

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

데이터 세트 생성

첫 번째 단계는 테스트를 위해 대규모 데이터 세트를 생성하는 것입니다. parquet 파일에 저장할 수 있는 많은 열을 가진 데이터 세트를 생성합니다. 이 단계에는 pandas 및 numpy 라이브러리가 필요합니다.

import pandas as pd
import numpy as np

def make_timeseries(start="2000-01-01", end="2000-12-31", freq="1D", seed=None):
    ## Function to generate timeseries data
    index = pd.date_range(start=start, end=end, freq=freq, name="timestamp")
    n = len(index)
    state = np.random.RandomState(seed)
    columns = {
        "name": state.choice(["Alice", "Bob", "Charlie"], size=n),
        "id": state.poisson(1000, size=n),
        "x": state.rand(n) * 2 - 1,
        "y": state.rand(n) * 2 - 1,
    }
    df = pd.DataFrame(columns, index=index, columns=sorted(columns))
    if df.index[-1] == end:
        df = df.iloc[:-1]
    return df

timeseries = [
    make_timeseries(freq="1T", seed=i).rename(columns=lambda x: f"{x}_{i}")
    for i in range(10)
]
ts_wide = pd.concat(timeseries, axis=1)
ts_wide.to_parquet("timeseries_wide.parquet")

적은 양의 데이터 로드

모든 데이터를 로드하는 대신, 필요한 열만 로드할 수 있습니다. 여기서는 parquet 파일에서 적은 양의 데이터를 로드하는 두 가지 방법을 보여줍니다.

## Option 1: Load all data then filter
columns = ["id_0", "name_0", "x_0", "y_0"]
pd.read_parquet("timeseries_wide.parquet")[columns]

## Option 2: Load only the requested columns
pd.read_parquet("timeseries_wide.parquet", columns=columns)

효율적인 데이터 타입 사용

Pandas 의 기본 데이터 타입은 메모리 효율성이 가장 높지 않습니다. 이 단계에서는 더 큰 데이터 세트를 메모리에 저장하기 위해 더 효율적인 데이터 타입을 사용하는 방법을 보여줍니다.

ts = make_timeseries(freq="30S", seed=0)
ts.to_parquet("timeseries.parquet")
ts = pd.read_parquet("timeseries.parquet")

## Convert 'name' column to 'category' type for efficiency
ts2 = ts.copy()
ts2["name"] = ts2["name"].astype("category")

## Downcast numeric columns to their smallest types
ts2["id"] = pd.to_numeric(ts2["id"], downcast="unsigned")
ts2[["x", "y"]] = ts2[["x", "y"]].apply(pd.to_numeric, downcast="float")

청크 (Chunking) 사용

청크는 큰 문제를 독립적으로 해결할 수 있는 더 작은 문제로 분할하는 방법입니다. 각 청크가 메모리에 맞는 한, 메모리보다 훨씬 큰 데이터 세트로 작업할 수 있습니다.

files = pathlib.Path("data/timeseries/").glob("ts*.parquet")
counts = pd.Series(dtype=int)
for path in files:
    df = pd.read_parquet(path)
    counts = counts.add(df["name"].value_counts(), fill_value=0)
counts.astype(int)

다른 라이브러리 사용

Dask 와 같은 다른 라이브러리는 메모리보다 큰 데이터 세트를 처리할 수 있습니다. Dask 는 pandas 와 유사한 API 를 제공하며 데이터를 병렬로 처리할 수 있습니다.

import dask.dataframe as dd

ddf = dd.read_parquet("data/timeseries/ts*.parquet", engine="pyarrow")

## Compute value counts using Dask
ddf["name"].value_counts().compute()

요약

이 랩에서는 pandas 를 사용하여 데이터 분석을 더 큰 데이터 세트로 확장하는 다양한 기술을 시연했습니다. 대규모 데이터 세트를 생성하고, 더 적은 데이터를 로드하는 방법, 효율적인 데이터 유형 사용, 그리고 청크 (chunking) 에 대해 배웠습니다. 또한 메모리보다 큰 데이터 세트를 처리하기 위해 Dask 와 같은 다른 라이브러리를 활용하는 방법을 살펴보았습니다. 이 랩에서 배운 기술과 개념은 데이터 분석 프로젝트에서 대규모 데이터 세트를 다룰 때 유용할 것입니다.