https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr
퇴근후딴짓님의 캐글 연습문제 풀면서 내 코드 메모하기 및 공부
df['f1'].fillna( df.groupby("city")["f1"].transform("median") ,inplace=True )
그룹바이 + 트랜스폼
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한 함수 넣는 방법
추가공부 필요함
'IT,SW,Data,Cloud,코딩 > Python' 카테고리의 다른 글
2023년6월24일 제6회 빅데이터분석기사 실기 시험 후기 및 준비 방법 (0) | 2023.06.26 |
---|---|
20230623 그 외 함수 (문자열 등) (0) | 2023.06.23 |
빅분기 실기 대비 요약노트 (0) | 2023.06.23 |
20230622 이런저런함수들 (0) | 2023.06.22 |
20230620 넘파이 ceil, floor, trunc (0) | 2023.06.21 |
20230619 lightgbm (0) | 2023.06.19 |
20230619 빅분기 공부 5회 기출 유형 (0) | 2023.06.19 |
20230617 빅분기 4회 기출유형 제2유형 (0) | 2023.06.17 |
댓글