본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230621 캐글 연습문제 풀기

by 착실하게 2023. 6. 22.
반응형

https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr

 

Big Data Certification KR

빅데이터 분석기사 실기 (Python, R tutorial code)

www.kaggle.com

퇴근후딴짓님의 캐글 연습문제 풀면서 내 코드 메모하기 및 공부 

 

df['f1'].fillna( df.groupby("city")["f1"].transform("median") ,inplace=True )

그룹바이 + 트랜스폼 

 

https://wikidocs.net/152703

 

03-05. 함수연속적용_요소별 (transform)

####DataFrame.transform(func, axis=0, args, kwargs) ##개요 transform메서드는 agg와 비슷하게 함수를 적용하는 메서드이지만, …

wikidocs.net

transform 안에 함수 넣기 가능. 딕셔너리도 가능. 딕셔너리 사용하면 컬럼 순서 바꾸기도 바로 됨.

 

import pandas as pd 
import numpy as np 

col = ['col1','col2','col3']
row = ['row1','row2','row3']

df = pd.DataFrame(data=[[10,40,70],[20,50,80],[30,60,90]],index=row,columns=col)

print(df)

ex1 = df.transform(np.sqrt)
print(ex1)

ex2 = df.transform('sqrt')
print(ex2)

T1-4

#왜도, 첨도
s2 = df['SalePrice'].skew()
k2 = df['SalePrice'].kurt()

# 'SalePrice'컬럼 로그변환
df['SalePrice'] = np.log1p(df['SalePrice'])

T1-5

완료

 

T1-6

 

df.dropna(subset=['f1'],inplace=True)

df1 = df.groupby(['city','f2'],as_index = False).sum()

df1[ (df1['city'] == '경기') & (df1['f2'] == 0 )  ]['f1']


# f1컬럼 결측치 제거
df = df[~df['f1'].isnull()]
# 이렇게 ~ 을 쓰는 것도 가능하다.

T1-7

 

data['f4'] = data['f4'].replace('ESFJ','ISFJ')

 

T1-8

# 조건에 따른 누적합

df2 = df[df['f2'] == 1 ]['f1'].cumsum()

method = 'ffill' 과 method = 'pad' 는 완전히 동일하다고함. 스택오버플로우에서 누가그랬음.

 

T1-9

표준화(Standardization (Z-score Normalization))

 

fit 따로 transform 따로도 가능하고 fit_transform 도 가능하다.

 

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

df['f5']=scaler.fit_transform(df[['f5']])


from sklearn.preprocessing import StandardScaler
data = [[0, 2], [0.4, 0.2], [1.1, 10], [11, 19], [34, 21], [6, 40]]
scaler = StandardScaler()
print(scaler.fit(data))
print(scaler.transform(data))

 

T1-10

 

df['f1'].mode()의 반환값이 단일값이 아니라서 그런지 그냥 그렇게만 쓰면 fillna 되지 않음

df['f1'].mode()[0] 이라고 해주니까 원하는대로 fillna가 되었음 

print(df.isnull().sum())
print(df['f1'].mode()[0]) 

df['f1'] = df['f1'].fillna( df['f1'].mode()[0] )

print(df.isnull().sum())

 

 

박스칵스, 여존슨. 

from sklearn.preprocessing import power_transform
data = [[11, 12], [23, 22], [34, 35]]
print(data)
print(power_transform(data , method='yeo-johnson',standardize=True)) # method 디폴트 값은 여-존슨’yeo-johnson’
print(power_transform(data, method='box-cox',standardize=True))

박스칵스 사용 또다른 방법

 

from scipy import stats
data = [11, 12]
print(data)

data = stats.boxcox(data)
print(data)

 

T1-11

민맥스 보다가 딴데로 샘

 

apply 사용 

 

# https://wikidocs.net/151872 공부 

import pandas as pd 
import numpy as np 

col = ['col1','col2','col3']
row = ['row1','row2','row3']
data = [[1,2,3],[4,5,6],[7,8,9]]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)

print(df.apply(np.sqrt))
print(df.apply(np.sum))

print(df.apply(np.prod,axis=0))
print(df.apply(np.prod,axis=1))

print(df.apply(lambda x : [1,2,3]))
print(df.apply(lambda x : [1,2,3], axis=1)) #디폴트:result_type='reduce'
print(df.apply(lambda x : [1,2,3], axis=1,result_type='expand'))
print(df.apply(lambda x : [1,2,3], axis=1,result_type='broadcast'))

############################
# apply : 축 기준
# applymap : 요소 기준
############################

col = ['col1','col2','col3']
row = ['row1','row2','row3']
data = [[1,2,3],[4,5,6],[7,pd.NA,9]]
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)

print(df.applymap(lambda x : x**2,na_action='ignore'))

print(df.applymap(lambda x : x**2,na_action=None))

 

 rank( method = '인자' )

df['average']=df['Value'].rank(method='average')
df['min']=df['Value'].rank(method='min')
df['max']=df['Value'].rank(method='max')
df['first']=df['Value'].rank(method='first')
df['dense']=df['Value'].rank(method='dense')

average : D와 I의 경우 각각 3등 4등이기때문에 3.5 출력
min : A, B, F의 경우 각각 5등 6등 7등으로 가장 낮은등수인 5 출력
max : A, B, F의 경우 각각 5등 6등 7등으로 가장 높등수인 7 출력
first : 동점일경우 위에서부터 매김 D와 I 각각 3등 4등
dense : min처럼 동작하지만 등수가 순차적으로 증가

 

T1-12

상위 10개 국가의 접종률 평균과 하위 10개 국가의 접종률 평균 

top = df2['ratio'].head(10).mean()
bottom = df2['ratio'].tail(10).mean()

이런식으로 head, tail 함수 사용이 가능함

 

T1-13

 

상관관계는 양의 상관관계와 음의상관관계가 있으니까 

가장 작은 값이라 하면 절대값 기준으로 만들어서 뽑아야함

# 상관관계 구하기
# 주어진 데이터에서 상관관계를 구하고, quality와의 상관관계가 가장 큰 값과, 가장 작은 값을 구한 다음 더하시오!
# 단, quality와 quality 상관관계 제외, 소수점 둘째 자리까지 출력

import pandas as pd
import numpy as np

# 데이터 불러오기
df = pd.read_csv("../input/red-wine-quality-cortez-et-al-2009/winequality-red.csv")
# print(df.head())

# 상관관계 구하기 
df_corr = df.corr()
q = df_corr.loc['quality'].sort_values(ascending=False)[1:]
corr_max = q.max() 
q = abs(q)
corr_min = q.min()
print( round(corr_max + corr_min,2) )

 

T1-14

 

# city와 f4를 기준으로 f5의 평균값을 구한 다음, f5를 기준으로 상위 7개 값을 모두 더해 출력하시오 (소수점 둘째자리까지 출력)
# - 데이터셋 : basic1.csv 
# - 오른쪽 상단 copy&edit 클릭 -> 예상문제 풀이 시작
# - File -> Editor Type -> Script


import pandas as pd

df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")
# print(df.head())
df = df.groupby(['city','f4'])['f5'].mean()
df = df.reset_index()
# print(df.head())
df = df.sort_values(by='f5' , ascending=False)
df = df.head(7)
print(round(df['f5'].sum(),2))

 

 

T1-15

 

 

# 주어진 데이터 셋에서 age컬럼 상위 20개의 데이터를 구한 다음 
# f1의 결측치를 중앙값으로 채운다.
# 그리고 f4가 ISFJ와 f5가 20 이상인 
# f1의 평균값을 출력하시오!

# - 데이터셋 : basic1.csv 
# - 오른쪽 상단 copy&edit 클릭 -> 예상문제 풀이 시작
# - File -> Editor Type -> Script

import pandas as pd

# 데이터 불러오기
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")

df = df.sort_values(by='age',ascending=False).head(20)

# print(df.isnull().sum())

df['f1']=df['f1'].fillna( df['f1'].median() )

# print(df.isnull().sum())

cond1 = (df['f4'] == 'ISFJ')
cond2 = (df['f5'] >= 20 )

print(df[cond1 & cond2]['f1'].mean())

T1-16

 

분산은 var() 

 

# 주어진 데이터 셋에서 f2가 0값인 데이터를 age를 기준으로 오름차순 정렬하고
# 앞에서 부터 20개의 데이터를 추출한 후 
# f1 결측치(최소값)를 채우기 전과 후의 분산 차이를 계산하시오 (소수점 둘째 자리까지)

# - 데이터셋 : basic1.csv 
# - 오른쪽 상단 copy&edit 클릭 -> 예상문제 풀이 시작
# - File -> Editor Type -> Script

import pandas as pd

# 데이터 불러오기
df = pd.read_csv("../input/bigdatacertificationkr/basic1.csv")

df = df[df['f2'] == 0 ].sort_values(by='age',ascending=True).head(20)

before = df['f1'].var()
# print(df.isnull().sum())
df['f1'] = df['f1'].fillna( df['f1'].min()  )
# print(df.isnull().sum())
after = df['f1'].var()
print(round(before-after,2))

 

T1-17

df['Date'] = pd.to_datetime(df['Date'])

# 새로운 컬럼 추가 (년, 월, 일)
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day

T1-18

 

df['dayofweek'] = df['Date'].dt.dayofweek

0 월 1 화 2 수 3 목  4 금  5 토  6 일 

 

import pandas as pd 

df = pd.read_csv('data/20/members.csv')
# print(df.info())

df['Date']=pd.to_datetime(df['Date'])

df['dayofweek'] = df['Date'].dt.dayofweek

df['weekend'] = df['dayofweek'].apply(lambda x: x>=5 )
# 0123456 월화수목금토일
# 주말 = 토일 = 5,6 
# df['weekend'] 에 x>=5 이면 True, 아니면 False로 들어감

T1-19

apply에 def한 함수 넣는 방법 

추가공부 필요함

 

 

반응형

댓글