[실습] Python : 05. Time_Series

yeppi1802·2024년 6월 22일

개념정리

Q64. 데이터를 로드하고 각 열의 데이터 타입을 파악하라

import pandas as pd
DriveUrl = 'DriveUrl_자료주소'
df = pd.read_csv(DriveUrl)
df.info()
# info() : 데이터 타입 확인 가능 함수 

Q65. Yr_Mo_Dy을 판다스에서 인식할 수 있는 datetime64타입으로 변경하라

df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
# pd.to_datetime() : 데이터타입을 datetime64로 변경함 
Ans = df.Yr_Mo_Dy
Ans.head()
Ans.info()

Q66. Yr_Mo_Dy에 존재하는 년도의 유일값을 모두 출력하라

Ans = df.Yr_Mo_Dy.dt.year.unique()
# unique() : 유일값 리스트 출력
# dt.year : 년도만 추출
Ans

Q67. Yr_Mo_Dy에 년도가 2061년 이상의 경우에는 모두 잘못된 데이터이다. 해당경우의 값은 100을 빼서 새롭게 날짜를 Yr_Mo_Dy 컬럼에 정의하라

def fix_century(x):
    import datetime # 패키지 불러옴 
                    # 밖에서 실행해도 되지만 안에서 실행하면 함수 호출만해도 자동 실행 가능

    year = x.year - 100 if x.year >= 2061 else x.year
    return pd.to_datetime(datetime.date(year, x.month, x.day))

df['Yr_Mo_Dy'] = df['Yr_Mo_Dy'].apply(fix_century)

Ans = df.head(4)
Ans
df.Yr_Mo_Dy.dt.year.unique()

Q68. 년도별 각컬럼의 평균값을 구하여라

Ans = df.groupby(df.Yr_Mo_Dy.dt.year).mean(numeric_only=True)
# group by : 년도별로 나눠야하기에
# mean(numeric_only=True) : 숫자에 대한 평균 값
Ans

Q69. weekday컬럼을 만들고 요일별로 매핑하라 ( 월요일: 0 ~ 일요일 :6)

df['weekday'] = df.Yr_Mo_Dy.dt.weekday
# weekday : 요일
# 월:0 ~ 일:6
# dt.weekday : 요일 만드는 함수

Ans = df['weekday'].head(3).to_frame()
Ans

Q70. weekday컬럼을 기준으로 주말이면 1 평일이면 0의 값을 가지는 WeekCheck 컬럼을 만들어라

df['WeekCheck']  = df['weekday'].map(lambda x : 1 if x in [5,6] else 0)
# 주말 : 토(5), 일(6)

Ans = df[['weekday', 'WeekCheck']]
Ans.head()

Q71. 년도, 일자 상관없이 모든 컬럼의 각 달의 평균을 구하여라

Ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean(numeric_only=True)
# dt.month : 월값 추출
Ans

Q72. 모든 결측치는 컬럼기준 직전의 값으로 대체하고 첫번째 행에 결측치가 있을경우 뒤에있는 값으로 대체하라

df = df.fillna(method='ffill').fillna(method='bfill')
# fillna() : 빈값에 어떤 값을 넣어라
# method='ffill' : first fill 약자, 앞에 있는걸로 채워라
# method='bfill' : back fill 약자, 뒤에 있는 걸로 채워라

df.isnull().sum()

Q73. 년도 - 월을 기준으로 모든 컬럼의 평균값을 구하여라

Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).mean(numeric_only=True)
# dt.to_period('M') : 년도 월 형태로 데이터 
Ans.head(3)

Q74. 년도 - 월을 기준으로 모든 컬럼의 최대값을 구하여라

Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).max(numeric_only=True)
Ans.head()

Q75. RPT와 VAL의 컬럼을 일주일 간격으로 각각 이동평균한값을 구하여라

Ans= df[['RPT','VAL']].rolling(7).mean()
# 이동평균한값 : 7일에 대한 평균값을 구함 : 0~6, 1~7, 2~8
#             : 0~5일은 데이터가 7일이 안되서 평균 못구함 
# rolling(n) : n 행수에 대한 데이터 모음
Ans.head(9)

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

DriveUrl = 'https://drive.google.com/uc?id=18wTLHQ2sHlx_USrwTFimMFcLqjxiXuw8'
df = pd.read_csv(DriveUrl)
df.head()
def change_date(x):
    import datetime
    hour = x.split(':')[1]
    date = x.split(":")[0]
    # split(':')[1] : ':' 기준으로 데이터를 나눔

    if hour =='24':
        hour ='00:00:00'

        FinalDate = pd.to_datetime(date +" "+hour) + datetime.timedelta(days=1)
				# 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()
# Ans.sort_values('(년-월-일:시)').head(24)

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

df['dayName']  =df['(년-월-일:시)'].dt.day_name()
# dt.day_name() : 요일을 문자열로 치환 

Ans = df['dayName']
Ans

Q78. 요일별 각 PM10등급의 빈도수를 파악하라

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

Ans2 = Ans1.pivot(index='dayName',columns='PM10등급',values='size').fillna(0)
# pivot 테이블로 전환
Ans1
Ans2

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

df['(년-월-일:시)'].diff().unique()
# 시간을 차분했을 경우 첫 값은 nan, 이후 모든 차분값이 동일하면 연속이라 판단한다.
check = len(df['(년-월-일:시)'].diff().unique())
if check ==2:
    Ans =True
else:
    Ans = False 

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

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

Q81. 날짜 컬럼을 index로 만들어라

df.set_index('(년-월-일:시)',inplace=True)
# set_index(column) : 어떤 컬럼을 인덱스로 쓸지
# inplace=True : 반영한 값을 원본데이터에?
Ans = df
Ans.head()

0개의 댓글