Moonie

[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 7 본문

공부/자격증

[빅데이터 분석기사 실기] 데이터 전처리 python 100 - 7

Moonie' 2024. 10. 26. 00:29
반응형

아래 블로그를 참고하여 진행했습니다.

https://www.datamanim.com/dataset/99_pandas/pandasMain.html#google_vignette

 

 

이전 블로그에 이어서 작성했습니다.

https://moonie.tistory.com/38

 

데이터를 호출합니다.

import pandas as pd
dataurl = 'https://raw.githubusercontent.com/Datamanim/pandas/main/seoul_pm.csv'
df =pd.read_csv(dataurl)

 

Question 76

년-월-일:시 컬럼을 pandas에서 인식할 수 있는 datetime 형태로 변경하라. 서울시의 제공데이터의 경우 0시가 24시로 표현된다

 

def change_date(x):
    import datetime
    hour = x.split(':')[1]
    date = x.split(':')[0]

    if hour =='24':
        hour='00:00:00'
        FinalDate = pd.to_datetime(date+" "+hour) +datetime.timedelta(days=1)

    else:
        hour = hour + ':00:00'
        FinalDate = pd.to_datetime(date+" "+hour)

    return FinalDate

df['(년-월-일:시)'] = df['(년-월-일:시)'].apply(change_date)

Ans = df
Ans.head(3)

 

 

datetime.timedelta를 통해서 시간을 더하고 뺄 수 있음

 

 

Question 77

일자별 영어요일 이름을 dayName 컬럼에 저장하라

df['dayName']  =df['(년-월-일:시)'].dt.day_name()
Ans =df['dayName'] 
Ans.head(5)

 

dt.day_name() 을 통해서 영어요일 이름으로 저장

 

Question 78

일자별 각 PM10등급의 빈도수를 파악하라

ans1 = df.groupby(['dayName','PM10등급'],as_index=False).size()
ans1.head()

 

 

size()는 각 그룹의 원소 개수를 세어 데이터프레임으로 반환하는 역할을 합니다.

 

ans2 = ans1.pivot(index='dayName',columns='PM10등급',values='size').fillna(0)
ans2

 

  • .pivot() 메서드는 ans1을 dayName을 인덱스로, PM10등급을 열로 가지는 형태의 피벗 테이블로 변환합니다.
  • values='size'를 사용하여 각 dayName과 PM10등급 조합에 해당하는 개수를 값으로 설정합니다.
  • .fillna(0)는 데이터가 없는 경우 결측값(NaN)을 0으로 채워 요일별로 모든 PM10 등급의 개수를 표시할 수 있게 합니다.

Question 79

시간이 연속적으로 존재하며 결측치가 없는지 확인하라

check = len(df['(년-월-일:시)'].diff().unique())
if check == 2:
    Ans =True
else:
    Ans =False

 

df['(년-월-일:시)'].diff() 를 하면 한가지 값 밖에 나오지 않음으로 True가 나온다.

 

 

Question 80

오전 10시와 오후 10시(22시)의 PM10의 평균값을 각각 구하여라

기존 글 그대로 사용하면 에러가 나게된다. mean() 함수가 문자열 등 숫자가 아닌 데이터를 처리할 수 없어 에러가 발생하였다. 수정하면 다음과 같이 입력해야 한다.

Ans = df.select_dtypes(include=['number']).groupby(df['(년-월-일:시)'].dt.hour).mean().iloc[[10, 22], [0]]
Ans

select_dtypes(include=['number']) 를 사용해 숫자형 열만 선택하여 그룹화하고 평균을 계산합니다.

 

Question 81

날짜 컬럼을 index로 만들어라

df.set_index('(년-월-일:시)',inplace=True,drop=True)
Ans = df
Ans.head(3)

 

  • set_index('(년-월-일:시)'):
    • (년-월-일:시)라는 열을 인덱스로 설정하여 데이터프레임을 재구성합니다.
    • 이 열은 이제 행을 구분하는 기준(인덱스)이 됩니다.
  • inplace=True:
    • 이 매개변수를 True로 설정하면 df 데이터프레임이 직접 수정됩니다.
    • 새로 생성된 데이터프레임을 반환하지 않고, df 자체가 인덱스를 설정한 상태로 변경됩니다.
  • drop=True:
    • (년-월-일:시) 열을 데이터프레임에서 제거합니다.
    • 인덱스로 지정한 후 이 열이 데이터에 그대로 남아 있지 않도록 합니다.

 

 

Question 82

데이터를 주단위로 뽑아서 최소,최대 평균, 표준표차를 구하여라

Ans = df.select_dtypes(include=['number']).resample('W').agg(['min', 'max', 'mean', 'std'])
Ans.head(5)

집계 함수는 숫자형 데이터에서만 작동하기 때문에, df에 숫자형이 아닌 열이 포함되어 있으면 오류가 발생합니다.

숫자형 열만 선택하여 집계를 수행하면 이 문제를 해결할 수 있습니다. 다음과 같이 select_dtypes()를 사용해 숫자형 데이터만 포함된 데이터프레임을 대상으로 집계할 수 있습니다.

반응형
Comments