import pandas as pd
import numpy as np

# StandardScaler
# 기본 스케일, 평균과 표준편차 사용
# 평균을 0으로, 분산을 1로 모든 데이터를 변환하는 방법

from sklearn.preprocessing import StandardScaler
scaler = Standardscaler()
scaler.fit(data) # 모델 학습
# MinMaxScaler
# 최대/최소값이 각각 1, 0이 되도록 스케일링

sklearn.preprocessing.MinMaxScaler(feature_range = 0,1), copy = True, clip = False)
# 모델에 fit된 데이터를 기반으로 학습되며, 추가 데이터에는 비율이 적용됨

# 한번에
scaler.fit_transform()
# MaxAbsScaler
# 훈련 세트에 있는 각 기능의 최대 절대값이 1이 되도록 각 기능을 개별적으로 확장하고 변환
# 데이터를 이동/중앙에 배치하지 않으므로 희소성을 파괴하지 않음
class sklearn.preprocessing.MaxAbsScaler(*, copy = True)

# RobustScaler
# 중앙값(median)과 IQR(interquartile range) 사용, 아웃라이어의 영향을 최소화

'ADP > 실기' 카테고리의 다른 글

범주형 데이터 전처리  (0) 2024.01.23
결측치 , 이상치 처리하기  (0) 2024.01.23
데이터 샘플링  (0) 2024.01.21
날짜 데이터 핸들링  (0) 2024.01.21
데이터프레임에 함수 적용  (1) 2024.01.21

 

# 층화 임의 추출
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, shuffle = True, stratify = y, random_state = 48)
# shuffle 값이 True이면 무작위 추출, False이면 체계적 추출
df_t = pd.read_csv('../../data/titanic.csv')
df_t['survived'].value_counts()

# 오버샘플링
# SMOTE : Synthetic Minority Over-sampling Technique
from imblearn.over_sampling import SMOTE
! conda install -c conda-forge imbalanced-learn -y
# 여기서 마지막 -y는 모든 항목에 대해 yes라는 것을 의미

df_t = df_t.dropna()
# SMOTE를 사용할 때는 null값이 존재하면 안됨
X = df_t[['age', 'sibsp', 'parch', 'fare']]
y = df_t['survived']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, shuffle = True, random_state = 48)

# SMOTE 적용 전에, scaling 해주어야 함
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
X_train = scaler.fit_transform(X_train)

# 모델 설정
sm = SMOTE(k_neighbors = 5)
X_resampled, y_resampled = sm.fit_resample(X_train, y_train)

'ADP > 실기' 카테고리의 다른 글

결측치 , 이상치 처리하기  (0) 2024.01.23
데이터 표준화, 정규화  (0) 2024.01.23
날짜 데이터 핸들링  (0) 2024.01.21
데이터프레임에 함수 적용  (1) 2024.01.21
문자열 변환  (0) 2024.01.21

 

이 부분은 시계열 모델링 할 때에 기본이 되어야 하기에, 잘 숙지하고 있어야 함

# 날짜와 시간을 다루기 위해서 datetime 모듈을 이용

datetime.today()
datetime.today().year/month/day/hour
# 문자열 데이터를 날짜 형식으로 변환
datetime.strptime('날짜 문자열', '포맷')
# 날짜 데이터를 원하는 형식으로 변환
datetime객체.strftime('포맷')
from datetime import datetime
from datetime import timedelta

# 문자열로 변환
# 문자열 안에 타 문자 섞여도 상관 없음
today = datetime.today().strftime('%Y- dwd %m - dwd %d')
todaytime = datetime.today().strftime('%Y-%m-%d %H:%M:%S')

datetime.today()
todaytime = todaytime.split.split(" ")[0]

# 문자열 데이터 다시 날짜 형식으로 변환
datetime.strptime(todaytime, '%Y-%m-%d')

time = datetime.today()
time.year
time.month
time.day
time.hour
time.weekday()
# weekday에서 0-월, 1-화, 2-수 etc.
# 날짜 데이터 연산
 
# 현재 날짜로부터 100일 후의 날짜
timedelta(days=100)
# 데이터프레임 날짜 데이터 핸들링
pd.to_datetime(df['컬럼명'], format = '%Y%m%d')

import pandas as pd
df = pd.read_csv('../../data/구매내역.csv')

df_pur = df

df_pur.info()
# 이때 int로 되어 있어, 우선 str 형식으로 변환함
df_pur['datetime'] = df_pur['datetime'].astype(str)

# datetime으로 변환
df_pur['datetime'] = pd.to_datetime(df_pur['datetime'], format = '%Y%m%d')

df_pur.datetime.dt.month
df_pur[df_pur.datetime.dt.month.isin([6,7,8])]
# 날짜 데이터 -> 문자열로 변환
timeSeries.dt.strftime('%Y-%m-%d')

df.info()
dt['datetime'].dt.strftime('%Y-%m-%d')
df['datetime'].dt.strftime('%m')

'ADP > 실기' 카테고리의 다른 글

데이터 표준화, 정규화  (0) 2024.01.23
데이터 샘플링  (0) 2024.01.21
데이터프레임에 함수 적용  (1) 2024.01.21
문자열 변환  (0) 2024.01.21
데이터 모양 변경  (0) 2024.01.21
# apply : 행 또는 열 방향으로 주어진 함수를 한 번에 적용

# 두 개의 열 중에 큰 값이 선택되도록 하기
df_sejong[['전용면적(m^2)', '보증금(만원)']].apply(np,max, axis = 1)
# map(lambda) : 데이터 내부 각 요소를 처리하는 함수
data['col_name'] = data['col_name'].map(lambda x : x.func(), na_action = 'ignore')

# lambda는 간단한 함수 개념
# map(lambda)를 사용할 때에는 시리즈 형식이어야 함
# map은 원소 접근이어야 함
df_sejong['시군구'].map(lambda x : x.split(" "))
# map은 원소 접근이므로, str.split가 아닌 .split를 써야함

df_sejong['계약년월'].map(labmda x : str(x)[0:4])

 

'ADP > 실기' 카테고리의 다른 글

데이터 샘플링  (0) 2024.01.21
날짜 데이터 핸들링  (0) 2024.01.21
문자열 변환  (0) 2024.01.21
데이터 모양 변경  (0) 2024.01.21
데이터 정렬, 결합, 요약  (1) 2024.01.21

 

# 인덱싱
# 시리즈.str[:n] : 문자열 인덱스로 추출

import pandas as pd
import numpy as np

df_sejong = pd.read_csv('../../data/'  .csv')
df_sejong.drop(columns = 'Unnamed: 0', inplace = True)

df_sejong['시군구'].str[0:7]

# 앞자리만 추출
df_sejong['시'] = df_sejong['시군구'].str[0:7]
# 분할 - expand = True로 데이터프레임으로 가져옴
df_sejong_split = df_sejong['시군구'].str.split(" ", expand = True)

# 시작, 끝, 포함 글자 인식
df.str.startswith("시작글자")
df.str.endswith("끝글자")
df.str.contains("포함글자")
# 정수타입으로 변환
df_off['거래금액(만원)'] = df_off['거래금액(만원)'].str.replace(",", "")
df_off['거래금액(만원)'] = df_off['거래금액(만원)'].astype(int)

 

# 범주형 변수의 도수분포표, 이원분할표
df_t['survived'].value_counts()
pd.DataFrame(df_t['class'].value_counts())

# 기준이 두 개일때, pd.crosstab()
pd.DataFrame(df_t[['class', 'survived']].value_counts())
pd.crosstab(df_t['class'], df_t['survived'], dropna = True)

# 범주형 변수에 대한 상대도수비율
pd.crosstab(index, columns, dropna = , normalize = )
pd.crosstab(df_t['sex'], df_t['survived'])
pd.crosstab(df_t['sex'], df_t['survived'], normalize = True)
pd.crosstab(df_t['sex'], df_t['survived'], normalize = 'index')
pd.crosstab(df_t['sex'], df_t['survived'], normalize = 'columns')
# 데이터 모양 변경
# 데이터 재구조화(melt)

df_student.info()

# id_vars 자리에 주로 명목형 변수 들어감
melt_st = pd.melt(df_student, id_vars = ['id'], value_vars = ['kor', 'math', 'eng'],
	var_name = 'subject', value_name = 'score', ignore_index = True)
    
# 데이터 재구조화(pivot_table)
pd.pivot_table(melt_st, index = 'id', columns = 'subject', values= 'score')

'ADP > 실기' 카테고리의 다른 글

데이터프레임에 함수 적용  (1) 2024.01.21
문자열 변환  (0) 2024.01.21
데이터 정렬, 결합, 요약  (1) 2024.01.21
Row/Column 선택, 추가, 삭제, 조건에 따른 선택 및 삭제  (1) 2024.01.21
DataFrame 기본  (0) 2024.01.21

 

df_t.sort_index(axis = 0, ascending = False)
# axis = 0은 행 기준을 의미

df_t.sort_index(axis = 1, ascending = False)
# column 명으로 정렬

df_t.sort_values(by = ['age', 'fare'], ascending = False)
# R과 다른점 : 결합하려는 데이터프레임의 행과 열의 개수가 맞지 않아도, NaN 값이 채워짐

# pd.concat()
# default 값으로 axis = 0이 적용되어, 행 방향으로 데이터프레임 붙임
customer = pd.concat([customer1, customer2]).reset_index(drop = True)

# merge
# 두 데이터프레임에 존재하는 고유값(key)를 기분으로 병합
pd.merge(id_name, id_number, how = 'right', on = 'ID')
# how에 들어갈 수 있는 매개변수 : 'inner', 'outer', 'left', 'right'
df_iris.groupby(['target']).mean()

df_iris.groupby(['target']).mean().reset_index()

'ADP > 실기' 카테고리의 다른 글

데이터프레임에 함수 적용  (1) 2024.01.21
문자열 변환  (0) 2024.01.21
데이터 모양 변경  (0) 2024.01.21
Row/Column 선택, 추가, 삭제, 조건에 따른 선택 및 삭제  (1) 2024.01.21
DataFrame 기본  (0) 2024.01.21

 

# 이전 글에서 iris_data 변수 생성한 것 기반으로 작성

iris_data[['sepal length', 'sepal width']].head(2)

iris_data.loc[[4,5,10], ['sepal length', 'target']]

iris_data.iloc[0:7, 0:2]
iris_data['temp'] = range(0, 150)

iris_data = iris_data.drop(columns = ['temp', 'temp2])

drop_idx = [150, 151]
iris_data.drop(drop_idx, inplace = True)

# 결측치가 있는 모든 행 삭제, 하나라도 결측값 있을시 삭제됨
iris_data.dropna(inplace = True)

# 중복 값 삭제
iris_data[['target', 'count']].drop_duplicates()

 

 

# &와 |가 우선순위가 높아, 먼저 계산됨

import pandas as pd
import numpy as np

df_t = pd.read_csv('../../data/titanic.csv')
df_t.head()

df_t[df_t['survived'] == 1]

df_t.loc[df_t['survived'] == 1, 'temp'] = 99999

df_t.loc[df_t.age > 30, 'temp2'] = '30대 초과입니다.'

# 주의 : 데이터프레임으로 접근하여 값을 대입하면 오류 발생함
# np.where(condition, x, y) : 조건이 충족되면 x, 그렇지 않으면 y 반환
df_t['alive'] = np.where(df_t['survived'] == 1, 'Yes', 'No')

# np.select()
# 조건 목록과 선택 목록을 입력으로 받아서 조건에 따라 선택 목록의 요소로 구성된 배열을 반환
# 두 개 이상의 조건이 있을 때, Pandas의 주어진 조건을 기반으로 DataFrame 열을 만들 수 있음
conditionlist = [(df_t['age'] >= 19),(df_t['age'] > =8) & ( df_t['age'] < 19),
                 (df_t['age'] < 8)]
choicelist = ['성인', '초중고등학생', '미취학아동']

df_t['status'] = np.select(conditionlist, choicelist, default = 'Not_Specified')

'ADP > 실기' 카테고리의 다른 글

데이터프레임에 함수 적용  (1) 2024.01.21
문자열 변환  (0) 2024.01.21
데이터 모양 변경  (0) 2024.01.21
데이터 정렬, 결합, 요약  (1) 2024.01.21
DataFrame 기본  (0) 2024.01.21

+ Recent posts