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

20230613 파이썬공부

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

numeric_only=True 인자가 필요한 함수: sum(), mean(), corr() 이런것들. 

만약 groupby().sum()했는데 id값 string이 막 더해져서 나오면 numeric_only 넣어주면 된다. 

 

import pandas as pd 
import numpy as np 

#문제 8 
#결측값을 가진 데이터는 바로 뒤에 있는 값으로 대체한 후 (바로 뒤가 결측값이라면 뒤에 있는 데이터 중 가장 가까운 값)
#city와 f2컬럼 기준으로 그룹합을 계산한 뒤 
# views 가 세번째로 큰 city 이름은? 

df = pd.read_csv('data/members3.csv')
# print(df.head(10))
# print(df.isnull().sum())

# bfill (결측값이 있으면 뒤에 있는 비결측값으로 채우기), ffill (결측값이 있으면 앞에 있는 비결측값으로 채우기)

df = df.fillna(method='bfill')
# print(df.head(10))
# print(df.isnull().sum())

df = df.groupby(by=['city','f2']).sum(numeric_only=True).sort_values(by=['views'],ascending=False).reset_index()

print(df.loc[2]['city'])
print(df.iloc[2,0])

 

 

새롭게 알게된 것

판다스 to_datetime 

웬만한 문자열은 전부 알아서 바꾸어준다. 

만약, 내가 datetime으로 바꾸려고 하는 object가 좀 특이한 형태라면, format= 인자에 표시해주면 인식해서 바꿔준다. 

x = pd.to_datetime('2020-01-23', format='%Y-%m-%d')

datetime 에서 꺼내 쓸 때는 

.dt.year 이런식으로 꺼내쓰면 된다. .dt 라는 이름으로 속성이 예약되어 있나보다. 

import pandas as pd 

# 문제9
# 구독 (subscribed) 월별로 데이터 개수를 구한 뒤 가장 작은 구독 수가 있는 월을 구하시오. 

df = pd.read_csv('data/members3.csv')

# print(df.head())
# print(df.info()) 
df['subscribed'] = pd.to_datetime(df['subscribed'])
# print(df.info())

df['year'] = df['subscribed'].dt.year
df['month'] = df['subscribed'].dt.month
df['day'] = df['subscribed'].dt.day

# print(df.head())
df = df.groupby(['month']).count()
df = df.sort_values(['subscribed'])

print(df.index[0])

 

원핫인코딩 관련.

pd.get_dummies(X_train, columns=features) 그리고 pd.get_dummies(X_train[features])는 다른 방식으로 동작한다고함.

전자는 Features에 있는 컬럼을 무조건 원핫인코딩한다. 반환값은 원핫인코딩을 포함한 전체 데이터 프레임을 반환한다. 

후자는 선택한컬럼 중에 오브젝트자료형만 원핫인코딩하고 반환한다. 그래서 반환된 컬럼갯수가 전체컬럼에 적용한 결과값보다 작게되는 것임. 

 

 

import pandas as pd 

test = pd.read_csv('data/credit_card/test.csv')
train = pd.read_csv('data/credit_card/train.csv')

#신용카드 서비스를 떠나는 고객을 찾아라. 나이, 급여, 결혼 상태, 신용 카드 한도, 신용 카드 카테고리 등의 컬럼이 있음. 
# 평가: ROC-AUC, 정확도 (Accuracy), F1, 정밀도 (Precision), 재현율 (Recall) 구하기 # 분류에서 할수있는 다섯가지 모두 해보는 문제.
# target : Attrition_Flag (1이탈 0유지)

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score 

# eda 

print(train.shape, test.shape)
print(train.head())
print(train['Attrition_Flag'].value_counts())
# 6815 vs 1286 데이터에 이렇게 불균형이 있을 때는 모델의 성능이 좋지않을때가 있다. 

print(train.isnull().sum())
print(test.isnull().sum())
#결측치가 없었음


train = train.drop('CLIENTNUM',axis=1)
test_id = test.pop('CLIENTNUM')

#데이터 전처리 & 피처엔지니어링 

cols = train.select_dtypes(include=object).columns 

# baseline
# (1) object type이 5개 있었는데, 이걸 그냥 제거해버리는 스타일. 

# train = train.drop(cols,axis=1)
# # train.drop(cols,axis=1, inplace=True) #inplace=True 쓰면 바로 대입이 된다. 
# print(train.shape)
# test = test.drop(cols,axis=1)
# print(test.shape)


# print(train.head())
# print(test.head())

# (2) label
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
for col in cols: 
  train[col]=encoder.fit_transform(train[col])
  test[col]=encoder.transform(test[col])


# (3) one-hot 
# pandas 의 get_dummies
# train = pd.get_dummies(train, columns=cols)
# test = pd.get_dummies(test,columns=cols)



# 검증 데이터 분리
from sklearn.model_selection import train_test_split

X_tr, X_val, y_tr, y_val = train_test_split(train.drop('Attrition_Flag',axis=1),train['Attrition_Flag'],test_size=0.2,random_state=2022)

print(X_tr.head())

# 모델 불러오기, 학습, 예측
from sklearn.ensemble import RandomForestClassifier 

model = RandomForestClassifier(random_state=2022)
model.fit(X_tr, y_tr)
pred = model.predict(X_val)

print('accuracy_score')
print(accuracy_score(y_val,pred))

print('precision_score')
print(precision_score(y_val,pred))

print('recall_score')
print(recall_score(y_val,pred))

print('F1')
print(f1_score(y_val,pred))

# roc-auc 는 predict 가 아니라 predict_proba 를 사용한다. 
# roc-auc는 2개의 값을 반환한다. 0일 때의 확률과 1일 때의 확률. 
pred = model.predict_proba(X_val)
print('roc_auc_score')
print(roc_auc_score(y_val,pred[:,1]))

# test 예측
pred = model.predict_proba(test)
submit = pd.DataFrame({
  'CLIENTNUM' : test_id,
  'Attrition_Flag' : pred[:,1]
})
submit.to_csv('data/credit_card/20230613_01.csv',index=False)

# test_test = pd.read_csv('data/credit_card/20230613_01.csv')

# print(test_test.head())

y_test = pd.read_csv('data/credit_card/y_test.csv') # 실제로 시험에서 주어지는 데이터는 아니다. 

print(roc_auc_score(y_test,pred[:,1]))

 

 

 

반응형

댓글