[TIL] 21일차 TIL(20230307) - Python 시계열 분석 1
[TIL] 21일차 TIL(20230307) - Python 시계열 분석 1
1. Numpy
- np.linspace(시작, 끝, n): 시작 숫자와 끝 숫자를 포함하여 일정한 간격으로 둘 사이의 n개의 숫자를 생성하는 배열
- np.eye(n): n*n의 단위행렬 생성
- np.random.rand(n, m): 0과 1사이의 균등분포에서 n*m의 행렬을 생성
- np.random.randn(n. m): 표준정규분포에서 n*m의 행렬을 생성
- np.random.normal(loc=평균, scale=표준편차, size): 정규분포의 모수값을 지정하여 해당 분포에서 난수 생성
- np.random.randint(최소, 최대, 개수): 최솟값을 포함하고 최댓값을 제외한 범위에서 임의의 정수 생성
- np.random.seed(): 시드 지정, 같은 셀에 있어야 동작함
- arr.sum(axis = 0): 행에 걸쳐 합연산 수행, 각 열의 합 반환
- arr.sum(axis = 1): 열에 걸쳐 합연산 수행, 각 행의 합 반환
2. Pandas
- pd.read_excel('*.xlsx', sheet_name): 엑셀(xlsx)파일 불러오기
- pd.read_html(): html 읽어오기
- df.dropna(thresh = n): 각 행에 n개 이상의 결측치가 있을 경우 삭제(임계값 지정)
- df.idxmin(): 컬럼별 최솟값의 인덱스 반환
- df.idxmax(): 컬럼별 최댓값의 인덱스 반환
3. Pandas를 이용한 시각화
- 그래프의 크기를 지정하는 figsize옵션을 그래프 구문 안에 사용
- 그래프를 ax라는 객체로 지정하고 객체에 꾸미기 옵션들을 적용할 수 있음
- ax.set(xlabel, ylabel)
- ax.legend(loc, bbox_to_anchor = (x좌표, y좌표))
- ax.xaxis.grid(True), ax.yaxis.grid(True)
3.1 히스토그램
- df[col].plot.hist(edgecolor, bins, grid)
- autoscale옵션을 통해 축을 꽉 채워서 그래프를 그릴지의 여부를 설정할 수 있음
autoscale(axis, tight = True)
3.2 바그래프
- df.plot.bar(stacked = True)
- barh는 막대를 수평으로 하는 그래프를 그려줌
3.3 라인 그래프
- df.plot.line(y = 'col', lw, ls)
- 여러개의 컬럼을 한번에 지정하여 라인 그래프를 동시에 그릴 수 있음
3.4 영역차트
- df.plot.area(alpha, stacked = False)
3.5 산점도
- df.plot.scatter(x, y, c=color, s=size, cmap)
- 색상와 크기에 컬럼명을 지정하여 컬럼의 값에 따라 색상과 크기를 다르게 표현할 수 있음
3.6 박스플롯
- df.boxplot(by = 'col')
- by옵션으로 특정 컬럼에 따라 분리하여 박스플롯을 여러개 그릴 수 있음
3.7 커널밀도추정 그래프
- df['col'].plot.kde()
3.8 Hexagonal Bin Plot
- df.plot.hexbin(x, y, gridsize, cmap)
3.9 날짜 형식 축 지정
from matplotlib import dates
# 월요일을 기준으로 일주일 간격을 축으로 사용하도록 지정하는 구문
ax.xaxis.set_major_locator(dates.WeekdayLocator(byweekday = MO))
# 달의 정보만 축에 표시하도록 지정하는 구문(달의 첫날에 표시)
ax.xaxis.set_major_locator(dates.MonthLocator())
# 설정한 축을 그래프에서 보여줄 때 형식을 지정
ax.xaxis.set_major_formatter(dates.DateFormatter('%d'))
3.10 주요 축, 보조 축 설정
- ax.set_major_ ~: 주요 축의 옵션 설정
- ax.set_minor_ ~: 보조 축의 옵션 설정
ax = df['Close'].plot(xlim=['2017-01-01','2017-03-01'],ylim=[51,57],rot=0,title='2017 Starbucks Closing Stock Prices')
ax.set(xlabel='')
ax.xaxis.set_major_locator(dates.WeekdayLocator(byweekday = 0))
ax.xaxis.set_major_formatter(dates.DateFormatter('%d'))
ax.xaxis.set_minor_locator(dates.MonthLocator())
ax.xaxis.set_minor_formatter(dates.DateFormatter('\n\n%b'))
ax.yaxis.grid(True)
ax.xaxis.grid(True)
4. Datetime 다루기
- numpy array에서 dtype을 통해 datetime형식을 사용할 수 있음
np.arange('2018-06-01', '2018-06-23', 7, dtype = 'datetime64[D]')
- pd.date_range('2020-01-01', periods = 7, freq = 'D'): 2020-01-01로부터 day간격으로 7개의 날짜를 반환
- pd.to_datetime([date], format = '%d/%m/%Y'): 포맷을 지정해 일반적이지 않은 형태의 날짜도 인식하도록 설정할 수 있음
- DatetimeIndex에 min, max, argmin, argmax와 같은 연산함수들 사용 가능
- datetime 인덱스에 슬라이싱을 사용해 원하는 기간의 데이터를 추출할 수 있음
ex) df['2017-01-01' : '2017-12-31']
5. 시간 resampling
- 특정 시간 단위별로 그룹화하여 연산한 결과를 반환할 수 있음
- df.resample(rule).계산함수()
- 자주 사용할 rule의 종류는 다음과 같다.
요약어 | 내용 |
A,Y | yearly end frequency |
D | calendar day frequency |
W | weekly frequency |
M | month end frequency |
H | hourly frequency |
T, min | minutely frequency |
S | secondly frequency |
Q | quarter end frequency |
6. 시간 이동
-df.shift(periods, freq, fill_value)
- freq = 'M'을 사용하면 모든 인덱스를 월의 마지막 날에 할당하여 미뤄버림
7. Rolling과 Expanding
- df.rolling(window).mean(): 이동평균
- df.rolling(window).계산함수(): window의 수 만큼 이동하며 집계함수 적용
- df.expanding(n).계산함수(): n개만큼 누적해가며 집계함수 적용
df['Yearly Mean'] = df['UMTMVS'].rolling(window = 12).mean()
df.plot(figsize = (12, 5))
소감 및 정리
오늘부터 파이썬 시계열 분석 강의를 듣기 시작했다. 시계열 분석에 대해 전공으로 배우기는 했지만 파이썬으로 따로 실습은 진행하지 않아서 이론적인 부분만 알고있는 상태였는데 파이썬에서 간단한 코드로 구현하는 문법을 배울 수 있었다. 강의를 들으면서 모든 부분이 철저하게 시계열 분석에 맞춰져 있다는 느낌이 와서 좋았던 것 같다. 강의의 총 시간도 15시간으로 태블로 강의보다 긴 편이었는데, 길다면 긴 시간동안 '시계열 분석'이라는 명확한 목표에 포커스가 맞춰져있어서 심화적인 내용도 배우고 넘어갈 수 있을 것 같다. 아직까지는 크게 어려운 점은 없었지만, 시간 데이터를 많이 다뤄보지 않아서 중간중간 덜 효율적으로 코드를 짰던 것 같다 ㅋㅋ 강의를 더 수강하면서 시간 데이터에 맞는 효율적인 방법을 사용하는 것을 익히도록 해야겠다!