1. 일년은 보통 52주이나 때에 따라서는 53주가 되기도 한다.
여하튼 주별 가격 흐름을 연도별로 비교하는 데이터를 엑셀로 뿌려서 그래프를 그리는 코드를 짜고 있는데
과연 1주의 시작은 언제일까?
https://blog.naver.com/yakzip/221987910053
달력에 관련된 내용은 위 사이트를 참조하면 된다.
파이썬 판다스 resample('W").mean() 을 하면 일간 가격 데이터가 주간 가격 데이터로 변환되는데
1
2
|
import calendar
print(calendar.calendar(2020))
|
cs |
데이터를 찍어보면 위 사이트 설명대로 월요일을 기준으로 주간 평균 가격이 계산이 된다.
1
|
datetime.date(2016,1,4).isocalendar()[1]
|
cs |
특정 날짜가 몇 주차에 해당되는지는 위 코드대로 찍어보면 되는데..
2. 내가 원하는 데이터 구성을 위해서 일간 가격 데이터를 불러온 후 주간 평균 가격으로 불러온 후
1
|
df['Week'] = df['Date'].map(lambda x: x.isocalendar()[1])
|
cs |
위와 같이 구성하면 새로운 Week column을 만들 수 있다.
1
|
table_week = df.pivot_table(values = 'Data', index = 'Year', columns='Week')
|
cs |
문제는 피벗 테이블을 구성하기 위해 위와 같이 적용해보면 52주 및 53주차 데이터 표시가 이상하게 된다.
2016년 데이터의 경우 위 그래와 같이 52주 및 53주 표시가 이상하다.
데이터로 원인을 살펴보면 피벗테이블 구성을 위해 index를 Year로 구성했는데 위에서 나타난 바와 같이
2016년 52주차 평균 가격임에도 불구하고 Year가 2017년이 되면서 제대로 값이 할당되지 못하기 때문이다.
3. 어떻게 해결할까?
위와 같이 데이터가 이상한 부분에 시그널을 만들어서 Year 값에서 1을 빼서 전년도로 만들면 된다...
1
|
df2['Year'] = np.where(df2["signal"] == 1, df2['Year'].copy() - 1, df2['Year'].copy() )
|
cs |
간단한 일이지만 시간이 또... 또르륵
4. 여기서부터 아래는 수정 및 첨가 내용
1
2
3
4
5
6
7
|
WTI_W['Date'].copy().dt.date
WTI_W['Month'] = WTI_W['Date'].map(lambda x: x.month)
WTI_W['Year'] = WTI_W['Date'].map(lambda x: x.isocalendar()[0])
WTI_W['Date'] = WTI_W['Date'].dt.date
WTI_W['Week'] = WTI_W['Date'].map(lambda x: x.isocalendar()[1])
table_week = WTI_W.pivot_table(values = 'Data', index = 'Year', columns='Week')
|
cs |
isocalendar는 (ISO year, ISO week number, ISO weekday)을 튜플로 반환하기 때문에
WTI_W['Year'] = WTI_W['Date'].map(lambda x: x.year)
대신에 위와 같이 하면 손쉽게 주별 테이블을 만들 수 있다... ㅠ
ISO weekday는 월요일이 1을 나타내며 일요일이 7을 나타낸다.
5. 만약 ISO 기준과 다른 기준점을 잡고 싶다면
https://www.python2.net/questions-480227.htm
위 사이트를 참조해서 주차를 계산하는 함수를 만들어도 된다.