greatsangho의 이야기

캠프 17일차 - 데이터 전처리(2) 본문

프로그래밍/SK AI 캠프

캠프 17일차 - 데이터 전처리(2)

greatsangho 2024. 9. 12. 18:39

# 시계열데이터는 시간정보.. 과거와 현재 미래의 정보를 가지고 있음
# 년 월 일 요일 공휴일 로 파생피처를 생성한다
# 대부분 날자데이터는 판다스에서 문자열로 취급하는경우가 대다수
# to_date() 변환 
#  .dt.yaer  .dt.to_period() 등을 이용해서 분리
# 공휴일은 파이썬에 제공안함... 외부 라이브러리를 사용  (다양함)
# 연속적인 시계열 데이서 생성은 pd.date_range()

# 시계열 데이터 생성하기
ts_ms = pd.date_range(
    start='2024-01-01',
    end = '2024-09-11',
    #periods=100,
    freq='M',  # 월의시작일 MS  M:월의 마지막
    tz = 'Asia/Seoul'
)
!pip install holidays

import holidays
holiyday = holidays.KR()
df['is_holidyas'] =  df['new_date'].isin(holiyday).astype('int8')
df.head()

공휴일을 0과 1로 반환

 

apply - 시리즈 객체에 적용 함수, 람다와 사용

# apply  시리즈객체에 적용 - 함수 - 람다
import seaborn as sns
df = sns.load_dataset('titanic')
numeric_df = df.select_dtypes(include=['int64','float64'])
numeric_df['adult'] = numeric_df['age'].apply(lambda x : x > 20).astype('int')
numeric_df.head()

pipe - 객체를 함수에 매핑

def missing_value(x):
    return x.isnull()
    
titanic.pipe(missing_value)
titanic.apply(missing_value)

pipe와 apply는 True / False 형태로 반환

GPT로 개념을 정리하면,

  1. pipe 메서드 사용:
    • pipe 메서드는 전체 데이터프레임에 missing_value 함수를 적용하는 데 사용됩니다. 결과는 원본과 동일한 형태를 가진 불리언 데이터프레임으로, 각 항목이 원본 데이터프레임에서 결측값일 경우 True, 그렇지 않으면 False로 표시됩니다.
  2. apply 메서드 사용:
    • 마찬가지로, apply 메서드는 데이터프레임의 각 열에 대해 missing_value 함수를 적용하는 데 사용됩니다. 이 또한 결측값이 있는 위치를 나타내는 불리언 데이터프레임을 생성합니다.
  3. 두 메서드(pipe apply) 모두 동일한 출력을 생성합니다: 일반적으로 pipe 메서드는 연산 체이닝에 사용되고, apply는 데이터프레임의 축을 따라 함수를 적용하는 데 더 일반적으로 사용됩니다.
# 문자열 데이터 ex) 2024-01-23
# 문자열에서 년월까지만 추출한다음
# yyyy-mm 이 문자열을 datetime으로 변환

pd.to_datetime('2024-01') # Timestamp('2024-01-01 00:00:00')

def extract_yearmonth(df):
    return df['Date'].str[:7]
def convertDateTime(df):
    return pd.to_datetime(df, format="%Y-%m")
    
stock_df.pipe(extract_yearmonth).pipe(convertDateTime)[0]

이와 같이 활용 가능하다.

Join

pd.merge(df1,df2)  # inner
pd.merge(df1,df2,how='outer',on='id')  # full outer join

Join 정리

  • INNER JOIN: 두 테이블 간의 공통된 값이 있는 행만 반환합니다. 즉, 조인 조건을 만족하는 행들만 결과로 가져옵니다.
  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 조인 조건을 만족하는 행을 반환합니다. 오른쪽 테이블에 일치하는 값이 없으면 NULL로 채워집니다.
  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 조인 조건을 만족하는 행을 반환합니다. 왼쪽 테이블에 일치하는 값이 없으면 NULL로 채워집니다.
  • FULL OUTER JOIN: 두 테이블에서 조인 조건을 만족하는 모든 행을 반환하며, 어느 한쪽에만 존재하는 행도 NULL로 채워져 반환됩니다.
  • CROSS JOIN: 두 테이블의 모든 가능한 조합을 반환합니다. 즉, 첫 번째 테이블의 각 행이 두 번째 테이블의 모든 행과 결합됩니다.
  • SELF JOIN: 같은 테이블 내에서 자기 자신과 조인을 수행합니다. 주로 자기 자신과 비교가 필요할 때 사용됩니다.
  • NATURAL JOIN: 두 테이블 간 동일한 이름의 컬럼을 자동으로 기준으로 하여 조인합니다. 이때, 동일한 컬럼 이름이 없으면 오류가 발생할 수 있습니다.

그룹 지어 평균

g = titanic2.groupby(['class'])
g.mean()

groupby

group_cs = titanic.groupby(['class','sex'])
for key, data in group_cs:
    print(key,len(data),data.head(2))

그룹으로 묶은 key 값과 해당하는 key값에 해당하는 data로 구성

group_cs.get_group(('Second', 'male'))

표준편차 std()

titanic2 = titanic[['age','class','fare','survived']]
# class 별로 groupby 적용
# 모든 컬럼에 대해서 std() 적용
# fare 컬럼에 대해서 std()
grouped = titanic2.groupby(['class'])
print( grouped.std(numeric_only=True) )

print( grouped['fare'].std() )

print( grouped.fare.std() )

그룹 후 집계함수 한번에 적용하기 agg

# 그룹핑을 한후 여러개의 집계함수를 한번에 적용
grouped.agg(['mean','std'])

딕셔너리 형태로 각각 적용 가능

grouped.agg({
    'age' : 'mean',
    'fare' : 'std',
    'survived' : 'sum'
    })

transform() 서드 - Pandas에서 시리즈나 데이터프레임의 각 요소에 함수를 적용하여 변환된 결과를 반환

grouped.age.transform('mean')

# 정규화  Z-score  skleanlearn의 StandardScaler 가 지원  데이터를 정규분포형태로
# (x - x.mean() ) / x.std()
def z_score(x):
    return (x - x.mean() ) / x.std()
grouped.age.transform(z_score)

.index

해당 인덱스 추출

 

반응형