230320 / BSA03. 효율적인 메모리 관리와 프로그램 작성

BSA03_Efficient_Program.ipynb

 

패키지 불러오기

import pandas as pd
import numpy as np

!pip install pyarrow

 

데이터프레임 생성

def 데이터프레임생성(size):
  df = pd.DataFrame()
  df["나이"] = np.random.choice(100, size)  # 0~100에서 size만큼 난수 생성
  df["수행평가1"] = np.random.choice(["A", "B", "C", "D", "F"], size)  # A~F 사이에서 무작위로 선택
  df["수행평가2"] = np.random.choice(["상", "중", "하"], size)  # 상,중,하에서 무작위로 선택
  df["학점"] = np.random.choice(["[0,3)", "[3,3.5)", "[3.5,4)", "[4,4.3)"], size)
  df["합격확률"] = np.random.uniform(0,1,size)  # 0~1 사이에서 uniform하게 난수 생성
  df["결과"] = np.random.choice(["합격","불합격"],size)
  return df
  
df = 데이터프레임생성(1000000)
df.info()
 
df1 = df.copy()  # df1을 수정해도 df가 수정되지 않도록 (원본이 유지되도록)
df2 = df.copy()
df1.info()

 

수행작업 소요 시간 비교하기

%timeit df1["순위1"] = df1.groupby(["수행평가1", "학점"])["나이"].rank()
%timeit df1["순위2"] = df1.groupby(["수행평가1", "학점"])["합격확률"].rank()
%timeit df1["순위3"] = df1.groupby(["수행평가1", "학점", "결과"])["합격확률"].rank()

# string -> category 변환
df2["수행평가1"] = df2["수행평가1"].astype('category') 
df2["수행평가2"] = df2["수행평가2"].astype('category') 
df2["학점"] = df2["학점"].astype('category')
df2.info()

# downcasting
df2["나이"] = df2["나이"].astype('int8')
df2.info()

df2["합격확률"] = df2["합격확률"].astype('float32')  # 실수를 64비트를 32비트로 
df2.info()

df2["결과"] = df2["결과"].map({"합격":True, "불합격":False})  # 1bit 필요
df2.info()

%timeit df2["순위1"] = df2.groupby(["수행평가1", "학점"])["나이"].rank()
%timeit df2["순위2"] = df2.groupby(["수행평가1", "학점"])["합격확률"].rank()
%timeit df2["순위3"] = df2.groupby(["수행평가1", "학점", "결과"])["합격확률"].rank()

## 파일 저장
변수 = ["나이", "수행평가1", "수행평가2", "학점", "합격확률", "결과"]
df2 = df2[변수]
df1.to_csv("BSA03_df1.csv", index=False)  # 데이터프레임을 저장할 때 에러가 나지 않도록
df2.to_csv("BSA03_df2.csv", index=False)

df1csv = pd.read_csv('BSA03_df1.csv')
df2csv = pd.read_csv('BSA03_df2.csv')

df1csv.info()

# 데이터 파일로 저장되는 순간 내가 지정한 형식은 기억하지 못하고 사라짐 (순수하게 데이터만 저장됨)
df2csv.info()

df2.to_parquet('BSA03_df2.parquet')  # 기본 데이터 저장방식 
df2pqt = pd.read_parquet('BSA03_df2.parquet')  # 저장한 파일 불러와서 df2pqt로 지정
df2pqt.info()

 

수행작업 소요 시간 비교하기

# 전처리 작업 (분석하고자 하는 데이터를 만들어가는 과정)
# 코드 작성할 줄 알아야 함!!!

def 변수추가(행자료):
    if 행자료["나이"] < 65:
        return 행자료["수행평가1"]
    if (행자료["합격확률"] >= 0.6) & (행자료["학점"] == "[4,4.3]"):
        return 행자료["수행평가1"]
    return(행자료["수행평가2"])
    
df = 데이터프레임생성(100_000)
df1 = df.copy()
df2 = df.copy()
df3 = df.copy()


# 1. loop를 이용한 프로그램
%%timeit
for index, row in df1.iterrows():  # 한 행씩 가져와서 그 행의 index와 row를 가져옴
    df1.loc[index,"평가"] = 변수추가(row)
    
    
# 2. apply를 이용한 프로그램
%%timeit
df2["평가"] = df2.apply(변수추가, axis=1)  # axis=1 : apply function to each row (각 행에 함수 적용)
 
 
# 3. vectorized를 이용한 프로그램
# 데이터프레임 전체를 한 번에 물어봐서 결과를 출력함

(df3["나이"] < 65) | ((df3["합격확률"] >= 0.6) & (df3["학점"] == "[4,4.3]"))

%%timeit
df3["평가"] = df3["수행평가2"]  # 초기값으로 "수행평가2" 대입
조건 = (df3["나이"] < 65) | ((df3["합격확률"] >= 0.6) & (df3["학점"] == "[4,4.3]"))
df3.loc[조건, "평가"] = df["수행평가1"]  # 조건을 만족하면 "수행평가1" 대입