본문 바로가기

제로베이스/Python

Python 5. Time_Series

파이썬 기초 익히기5 

시계열 데이터!

 

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

import pandas as pd
DriveUrl = 'https://drive.google.com/~'
df = pd.read_csv(DriveUrl)
df.info()

 

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

df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
Ans = df.Yr_Mo_Dy
Ans.head()

#Ans.info()

 

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

Ans = df.Yr_Mo_Dy.df.year.unique()
Ans

## 변수명.df.year /  변수명.df.month 등 사용 가능

 

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)
Ans
## 에러 방지를 위해 numeric_only=True 옵션 필요

 

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

df['weekday'] = df.Yr_Mo_Dy.dt.weekday

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

 

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

df['WeekCheck'] = df['weekday'].map(lamda x : 1 if x in [5,6] else 0)

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

 

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

Ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean(numeric_only=True)
Ans

 

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

df = df.fillna(method = 'ffill').fillna(method = 'bfill')

df.isnull().sum()
✔ ffill = 앞데이터로 결측치 채우기
✔ bfill = 뒷데이터로 결측치 채우기
✔fillna(method='ffill')로 대체가 안된 결측치는 fillna(method='bfill')로 해결

 

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

Ans =df.groupby(df.Yr_Mo_Dy.df.to_period('M')).mean(numeric_only=True)
Ans.head(3)
dt.to_period('M') : 연도-월이 함께 있는 형태로 데이터 추출 가능

 

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()
Ans.head(9)
일주일 간격으로 이동평균한 값: 한 행씩 이동하면서 일주일치 평균 구하기
rolling(n): n단위로 행을 묶어줌

 

Q76. 년-월-일:시 컬럼을 pandas에서 인식할 수 있는 datetime 형태로 변경하라.

         서울시의 제공데이터의 경우 0시가 24시로 표현된다

## "연-월-일 : 시" 형태
## 0시가 24시로 표시돼서 날짜 갱신이 안됨 -> 0시로 바꾸고 날짜로 하루+1

def change_date(x):
	import datetime
    hour = x.split(':')[1]
    date = x.split(':')[0]
      
    if hour == '24' :		## 분리한 hour가 24이면 00:00:00으로 바꿔줌
    	hour = '00:00:00'
        			##datetime.timedelta(days=1)으로 하루치를 더해서 새로운 datetime 갱신
        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.sort_values('(년-월-일:시)').head(24)

 

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

df['dayName']  =df['(년-월-일:시)'].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)
Ans2
## 보기 좋게 피봇테이블로 바꿈

 

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

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

 

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

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

 

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

df.set_index('(년-월-일:시)',inplace=True)
Ans = df
Ans.head()
 set_index() 인덱스 선언 함수
 inplace=True 옵션은 반영된 값을 바로 적용하겠다는 의미

'제로베이스 > Python' 카테고리의 다른 글

Python 7. Merge, Concat  (0) 2024.06.29
Python 6. Pivot  (0) 2024.06.29
Python 4.Apply, Map  (0) 2024.06.28
python3. Grouping  (0) 2024.06.28
Python 2. Filtering & Sorting  (0) 2024.06.27