초봉5센티미터

TIL 16. 다운캐스팅 본문

교육/멋쟁이사자처럼 AI School 7기

TIL 16. 다운캐스팅

삶은돼지고기 2022. 10. 17. 19:54
728x90

downcast

- 데이터 형식을 다운그레이드하여 메모리 사용량 감소.

 

Parquet - 특징

- 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스, 열 지향 데이터 파일 형식

- 복잡한 데이터를 대량으로 처리하기 위해 향상된 성능과 함께 효율적인 데이터 압축 및 인코딩 체계를 제공

 

csv => 행단위

parquet => 열단위

- 열 단위 값은 동일한 데이터 타입이기에 압축에 유리하다

- 열 단위 압축은 효율적이고 저장 공간을 절약 가능하다.

 

히스토그램에서 범주형, 수치형 구분 기준
-> 그래프의 모형을 보고 판단
-> 수치형 - 연속적으로 붙어있음
-> 범주형 - 따로따로 띄어져있음

sns.barplot 에는 연산 기능이 있다
plotly 에서 barplot 처럼 연산을 할 수 있는 그래프
-> histogram

histogram에서 연산을 하는 옵션
-> histfunc


downcasy - 메모리 부담 줄이기

 

# data/HP_2020_sample.csv 파일을 로드
df = pd.read_csv("HP_2020_sample.csv")
df.shape
# dtypes 를 통해 데이터의 타입만 봅니다.
df.dtypes

기준년도             int64
가입자 일련번호         int64
처방내역일련번호         int64
일련번호             int64
성별코드             int64
연령대코드(5세단위)      int64
시도코드             int64
요양개시일자          object
약품일반성분명코드       object
1회 투약량         float64
1일투약량            int64
총투여일수            int64
단가             float64
금액               int64
데이터 공개일자        object
dtype: object

성별코드는 1과 2 두개로 이루어져 있음. 하지만 int64로 되어있어 메모리용량을 차지함

df.info()

dtypes: float64(2), int64(10), object(3)
memory usage: 36.5+ MB

현재 36.5MB의 용량을 차지한다.

 

성별코드의 dtype을 바꾸면 용량을 줄일 수 있다!

int8 or uint8로 변경가능

 

downcast 를 사용하면 데이터 타입 변경 가능하다.

# downcast = "unsigned"로 데이터 타입 크기 줄이기
df["성별코드"] = pd.to_numeric(df["성별코드"],downcast = "unsigned")

info로 살펴보면 데이터용량이 줄어듦

 

downcast는 pd.to_numeric을 사용한다.

bool => int8

int => unsigned

float => float

 

 

다음은 반복문을 사용해 컬럼단위로 순회하며 전체 컬럼의 데이터 용량을 줄어보자.

# 조건문과 반복문을 활용해서 int, float, object 대해서 downcast
# df[col].dtype.name 으로 데이터 타입명을 가져옵니다.
# 각 컬럼의 데이터 타입 이름이 int, float 으로 시작하는지를 봅니다.

for col in df.columns:
    dtype_name = df[col].dtypes.name
    if dtype_name.startswith("int"):
        if df[col].min() >=0: #unsigned는 0보다 큰값만 지정가능
            df[col] = pd.to_numeric(df[col],downcast = "unsigned") # 0보다 큰값은 unsigned
        else:
            df[col] = pd.to_numeric(df[col],downcast = "integer") # 0보다 작은값 integer
    elif dtype_name.startswith("float"):
        df[col] = pd.to_numeric(df[col],downcast = "float") # float 타입 변경
    elif dtype_name == "bool":
        df[col] = df[col].astype("int8")
    elif dtype_name == "object":
        df[col] = df[col].astype("category")
# 메모리 크기가 줄어든 것을 확인
df.info()

dtypes: category(3), float32(2), uint16(2), uint32(3), uint8(6)
memory usage: 10.7 MB

36.5MB에서 10.7MB까지 줄어든것을 확인할 수 있다.

 

처음 메모리용량을 줄일 수 있다고해서 1/10정도 줄어들려나? 라고 생각했는데

생각보다 엄청많은 용량이 줄어든것을 볼 수있다.

 

* 본글은 멋쟁이사자처럼 AI school 강의자료와 내용을 토대로 제작되었습니다.

Comments