[ Python ] 정형데이터 용량 줄이는 함수 소개 (연속형, 이산형, 문자형)

2020. 4. 12. 16:53분석 Python/Pandas Tip

광고 한 번씩 눌러주세요! 블로그 운영에 큰 힘이 됩니다 :)

 

 

파이썬에서 데이터를 그냥 사용하다 보면, 데이가 엄청 커서 불편할 때가 있다.
그래서 필자는 연속형,이산형,문자형에 따라 용량을 줄여주는 함수를 소개하겠다.

## 데이터 크기 확인 함수
def mem_usage(pandas_obj):
    if isinstance(pandas_obj,pd.DataFrame):
        usage_b = pandas_obj.memory_usage(deep=True).sum()
    else: # we assume if not a df it's a series
        usage_b = pandas_obj.memory_usage(deep=True)
    usage_mb = usage_b / 1024 ** 2 # convert bytes to megabytes
    return "{:03.2f} MB".format(usage_mb)

## 타입별 평균 크기 확인 함수
def type_memory(data) :
    for dtype in ['float','int','object']:
        selected_dtype = data.select_dtypes(include=[dtype])
        mean_usage_b = selected_dtype.memory_usage(deep=True).mean()
        mean_usage_mb = mean_usage_b / 1024 ** 2
        print("Average memory usage for {} columns: {:03.2f} MB".format(dtype,mean_usage_mb))

## 이산형 데이터 사이즈 축소 함소
def int_memory_reduce(data) :
    data_int = data.select_dtypes(include=['int'])
    converted_int = data_int.apply(pd.to_numeric,downcast='unsigned')
    print(f"Before : {mem_usage(data_int)} -> After : {mem_usage(converted_int)}")
    data[converted_int.columns] = converted_int
    return data

## 연속형 데이터 사이즈 축소 함소
def float_memory_reduce(data) :
    data_float = data.select_dtypes(include=['float'])
    converted_float = data_float.apply(pd.to_numeric,downcast='float')
    print(f"Before : {mem_usage(data_float)} -> After : {mem_usage(converted_float)}")
    data[converted_float.columns] = converted_float
    return data

## 문자형 데이터 사이즈 축소 함소
def object_memory_reduce(data) :
    gl_obj = data.select_dtypes(include=['object']).copy()
    converted_obj = pd.DataFrame()
    for col in gl_obj.columns:
        num_unique_values = len(gl_obj[col].unique())
        num_total_values = len(gl_obj[col])
        if num_unique_values / num_total_values < 0.5:
            converted_obj.loc[:,col] = gl_obj[col].astype('category')
        else:
            converted_obj.loc[:,col] = gl_obj[col]
    print(f"Before : {mem_usage(gl_obj)} -> After : {mem_usage(converted_obj)}")
    data[converted_obj.columns] = converted_obj
    return data

 데이터 전체 용량 확인 함수

mem_usage(data)

타입별 평균 용량 확인

type_memory(data)

이산형 데이터 축소 후 반환값 받는 함수

int_memory_reduce(data)

연속형 데이터 축소 후 반환값 받는 함수

float_memory_reduce(data)

문자형 데이터 축소 후 반환값(pd.Categorical 사용)

object_memory_reduce(data)

!!!

역시 문자형으로 지정한 것이 메모리를 가장 많이 차지 한다.

 

728x90