본문 바로가기

Python

isocalendar와 52주 데이터(20200806 수정)

1. 일년은 보통 52주이나 때에 따라서는 53주가 되기도 한다.

   여하튼 주별 가격 흐름을 연도별로 비교하는 데이터를 엑셀로 뿌려서 그래프를 그리는 코드를 짜고 있는데

   과연 1주의 시작은 언제일까?

   https://blog.naver.com/yakzip/221987910053

 

한 주의 시작이 세계별로 다른 문제..

파이썬에 기본적으로 있는 calendar로 달력을 만들다가놀라운 사실을 발견했다.​우리나라는 주의 시작이 ...

blog.naver.com

 

   달력에 관련된 내용은 위 사이트를 참조하면 된다.

   파이썬 판다스 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

 

datetime - 파이썬에서 주어진 연도 및 주에 대한 모든 날짜를 얻는 방법?

1 년 "2017"과 isocalendar week "13"이 있다고 가정합니다. 파이썬에서 목록으로 올해와 달력 주에 해당하는 모든 날짜를 어떻게 효율적으로 (날짜 시간이나 달력과 같은 라이브러리를 사용하여) 얻을 �

www.python2.net

   

   위  사이트를 참조해서 주차를 계산하는 함수를 만들어도 된다.