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" 대입
'Statistics > BSA' 카테고리의 다른 글
230327 / BSA04. 다양한 형태의 자료 파일 작업 속도 비교 (0) | 2023.04.02 |
---|---|
230322 / BSA03. 데이터 분석 주요 과정 살펴보기 (0) | 2023.03.26 |
230320 / BSA03. 가상환경에서 주피터랩 설치하기, 주피터노트북에서 자동완성 기능 구현하기 (0) | 2023.03.26 |
230315 / BSA02. SNS 데이터 가져오기, 진행바(progress bar) 추가하기 (0) | 2023.03.26 |
230315 / BSA02. 다양한 금융자료들 간 환율 비교, 1분 단위로 사이트 접속하여 데이터 가져오기 (0) | 2023.03.26 |