Table of Contents

Python

[Python] 대규모 데이터셋을 다루는 경우

꼬꼬마코더 2024. 7. 19. 05:10
728x90

대규모 데이터셋을 다루는 경우, Python에서 메모리 문제나 데이터 저장 오류가 발생할 수 있습니다. 이를 해결하기 위한 몇 가지 접근 방법을 제안합니다:

1. 데이터 처리 최적화

  • 데이터 타입 줄이기: 데이터 타입을 효율적으로 변경하여 메모리 사용량을 줄일 수 있습니다.
  • 필요한 열만 사용: 필요한 열만 선택하여 메모리 사용을 최적화할 수 있습니다.
import pandas as pd
import numpy as np

# 데이터 타입 줄이기
def optimize_memory(df):
    for col in df.select_dtypes(include=['int']).columns:
        df[col] = pd.to_numeric(df[col], downcast='unsigned')
    for col in df.select_dtypes(include=['float']).columns:
        df[col] = pd.to_numeric(df[col], downcast='float')
    return df

# 데이터 로드 및 메모리 최적화
df = pd.read_csv('large_dataset.csv')
df = optimize_memory(df)

2. 청크(chunk) 단위로 데이터 처리

  • 청크 단위로 읽기: 한 번에 전체 데이터를 메모리에 로드하지 않고, 청크 단위로 데이터를 읽어 처리합니다.
# 청크 단위로 데이터 처리
chunk_size = 10000
chunks = pd.read_csv('large_dataset.csv', chunksize=chunk_size)

# 청크 단위로 데이터 처리 예시
for chunk in chunks:
    chunk = optimize_memory(chunk)
    # 청크 단위로 필요한 데이터 처리
    # 예: 롤링 윈도우 적용
    chunk = chunk.groupby('그룹컬럼').apply(apply_rolling_slope)
    # 처리된 청크 저장
    chunk.to_csv('processed_large_dataset.csv', mode='a', index=False, header=False)

3. Dask 사용

  • Dask: Dask는 대규모 데이터셋을 효율적으로 처리할 수 있도록 설계된 라이브러리입니다. Dask DataFrame은 pandas와 유사한 인터페이스를 제공하지만, 대규모 데이터셋을 분산하여 처리할 수 있습니다.
import dask.dataframe as dd

# Dask 데이터프레임으로 로드
ddf = dd.read_csv('large_dataset.csv')

# Dask로 롤링 윈도우 및 기타 계산 적용
def apply_rolling_slope_dask(df):
    df = df.sort_values('계약년월')
    df['slope3'] = df['target'].rolling(window=3).apply(get_slope, raw=True)
    df['std3'] = df['target'].rolling(3).std()
    df['mean3'] = df['target'].rolling(3).mean()
    df['skew3'] = df['target'].rolling(3).skew()
    df['kurt3'] = df['target'].rolling(3).kurt()
    df['min3'] = df['target'].rolling(3).min()
    df['max3'] = df['target'].rolling(3).max()
    return df

# 그룹화 및 함수 적용
result_ddf = ddf.groupby('그룹컬럼').apply(apply_rolling_slope_dask, meta=ddf)

# 결과 저장
result_ddf.to_csv('processed_large_dataset_dask.csv', single_file=True)

4. 효율적인 저장 형식 사용

  • HDF5: HDF5는 대용량 데이터 저장에 효율적인 형식입니다.
  • Parquet: Parquet은 컬럼형 저장 형식으로, 대규모 데이터셋의 효율적인 저장과 처리가 가능합니다.
# HDF5로 저장
df.to_hdf('large_dataset.h5', key='df', mode='w')

# Parquet로 저장
df.to_parquet('large_dataset.parquet')

종합 예제 코드

아래는 최적화된 메모리 사용, 청크 단위 처리, Dask 사용을 종합적으로 보여주는 예제 코드입니다:

import pandas as pd
import numpy as np
import dask.dataframe as dd

# 데이터 타입 줄이기 함수
def optimize_memory(df):
    for col in df.select_dtypes(include=['int']).columns:
        df[col] = pd.to_numeric(df[col], downcast='unsigned')
    for col in df.select_dtypes(include=['float']).columns:
        df[col] = pd.to_numeric(df[col], downcast='float')
    return df

# 롤링 윈도우 함수 정의
def get_slope(series):
    x = np.arange(len(series))
    if len(series) < 2:
        return np.nan
    else:
        slope = np.polyfit(x, series, 1)[0]
        return slope

# Dask로 롤링 윈도우 및 기타 계산 적용 함수
def apply_rolling_slope_dask(df):
    df = df.sort_values('계약년월')
    df['slope3'] = df['target'].rolling(window=3).apply(get_slope, raw=True)
    df['std3'] = df['target'].rolling(3).std()
    df['mean3'] = df['target'].rolling(3).mean()
    df['skew3'] = df['target'].rolling(3).skew()
    df['kurt3'] = df['target'].rolling(3).kurt()
    df['min3'] = df['target'].rolling(3).min()
    df['max3'] = df['target'].rolling(3).max()
    return df

# Dask 데이터프레임으로 로드
ddf = dd.read_csv('large_dataset.csv')

# 그룹화 및 함수 적용
result_ddf = ddf.groupby('그룹컬럼').apply(apply_rolling_slope_dask, meta=ddf)

# 결과 저장
result_ddf.to_csv('processed_large_dataset_dask.csv', single_file=True)

위 방법들을 사용하여 대규모 데이터셋을 효율적으로 처리하고 저장할 수 있습니다. 상황에 맞게 적절한 방법을 선택하여 사용하면 됩니다.

'Python' 카테고리의 다른 글

RuntimeError: Numpy is not available  (0) 2024.07.25
[Python] 메모리 관리  (0) 2024.07.19
reindex와 reset_index의 차이  (0) 2024.07.18
인덱스 Index, concat 전에는 reset_index  (0) 2024.07.18
Pylance has crashed.  (0) 2024.07.16