📖 Time_Series
🌟 Yr_Mo_Dy을 판다스에서 인식할 수 있는 datetime64타입으로 변경
df.Yr_Mo_Dy = pd.to_datetime(df.Yr_Mo_Dy)
Ans = df.Yr_Mo_Dy
Ans.head()
Ans.info()
🌟 Yr_Mo_Dy에 존재하는 년도의 유일값을 모두 출력
- datatime으로 변환시켰기에 다양한 문법 사용가능
dt.year : 연도만 추출
dt.month : 월만 추출
dt.day : 일자만 추출
unique() : 유일무의한 값
Ans = df.Yr_Mo_Dy.dt.year.unique()
Ans
🌟 잘못된 데이터를 수정해 컬럼에 정의
💭 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
🌟 년도별 각컬럼의 평균값을 구하기
numeric_only=True : 미래에 버전업이 되면 오류가 생길 수 있으니 작성
Ans = df.groupby(df.Yr_Mo_Dy.dt.year).mean(numeric_only=True)
Ans
🌟 weekday컬럼을 만들고 요일별로 매핑
- 월요일: 0 ~ 일요일 :6
weekday : 요일
df['weekday'] = df.Yr_Mo_Dy.dt.weekday
Ans = df['weekday'].head(7).to_frame()
Ans
🌟 weekday컬럼을 기준으로 WeekCheck 컬럼을 만들기
주말이면 1 / 평일이면 0의 값을 가지는 컬럼
df['WeekCheck'] = df['weekday'].map(lambda x : 1 if x in [5,6] else 0)
Ans = df[['weekday', 'WeekCheck']]
Ans.head()
🌟 년도, 일자 상관없이 모든 컬럼의 각 달의 평균을 구하기
Ans = df.groupby(df.Yr_Mo_Dy.dt.month).mean(numeric_only=True)
Ans
🌟 모든 결측치 컬럼기준 직전의 값으로 대체하고 첫번째 행에 결측치가 있을경우 뒤에있는 값으로 대체
- 결측치 : null값
ffill : first fill의 약자이며 앞에 있는 값으로 채워준다.
bfill : back fill의 약자이며 뒤에 있는 값으로 채워준다.
df = df.fillna(method='ffill').fillna(method='bfill')
df.isnull().sum()
🌟 년도 - 월을 기준
💭 모든 컬럼의 평균값을 구하기
to_period : DatetimeIndex를 PeriodIndex로 변환하는 메서드
Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).mean(numeric_only=True)
Ans.head(3)
💭 모든 컬럼의 최대값을 구하기
Ans = df.groupby(df.Yr_Mo_Dy.dt.to_period('M')).max(numeric_only=True)
Ans.head()
🌟 RPT와 VAL의 컬럼을 일주일 간격으로 각각 이동평균한값을 구하기
Ans= df[['RPT','VAL']].rolling(7).mean()
Ans.head(9)
🌟 년-월-일:시 컬럼을 pandas에서 인식할 수 있는 datetime 형태로 변경 후 서울시의 제공데이터의 경우 0시가 24시로 표현
x.split(':') : ' : ' 기준으로 나누겠다
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()
Ans.sort_values('(년-월-일:시)').head(24)
🌟 일자별 영어요일 이름을 dayName 컬럼에 저장
df['dayName'] =df['(년-월-일:시)'].dt.day_name()
Ans =df['dayName']
Ans
🌟 요일별 각 PM10등급의 빈도수를 파악
Ans1 = df.groupby(['dayName','PM10등급'],as_index=False).size()
Ans2 = Ans1.pivot(index='dayName',columns='PM10등급',values='size').fillna(0)
🌟 시간이 연속적으로 존재하며 결측치가 없는지 확인
check = len(df['(년-월-일:시)'].diff().unique())
if check ==2:
Ans =True
else:
Ans = False
🌟 오전 10시와 오후 10시(22시)의 PM10의 평균값을 각각 구하기
Ans = df.groupby(df['(년-월-일:시)'].dt.hour).mean(numeric_only=True).iloc[[10,22],[0]]
Ans
🌟 날짜 컬럼을 index로 만들기
df.set_index('(년-월-일:시)',inplace=True)
Ans = df
Ans.head()