우선 Upsampling 예제코드를 보면,
# upsample to daily intervals with spline interpolation
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, index_col=0, parse_dates=True,
squeeze=True, date_parser=parser)
upsampled = series.resample('D').mean()
interpolated = upsampled.interpolate(method='spline', order=2)
print(interpolated.head(32))
interpolated.plot()
pyplot.show()
Month
1901-01-01 266.000000
1901-01-02 258.630160
1901-01-03 251.560886
1901-01-04 244.720748
1901-01-05 238.109746
1901-01-06 231.727880
1901-01-07 225.575149
1901-01-08 219.651553
1901-01-09 213.957094
1901-01-10 208.491770
1901-01-11 203.255582
1901-01-12 198.248529
1901-01-13 193.470612
1901-01-14 188.921831
1901-01-15 184.602185
1901-01-16 180.511676
1901-01-17 176.650301
1901-01-18 173.018063
1901-01-19 169.614960
1901-01-20 166.440993
1901-01-21 163.496161
1901-01-22 160.780465
1901-01-23 158.293905
1901-01-24 156.036481
1901-01-25 154.008192
1901-01-26 152.209039
1901-01-27 150.639021
1901-01-28 149.298139
1901-01-29 148.186393
1901-01-30 147.303783
1901-01-31 146.650308
1901-02-01 145.900000
Freq: D, Name: Sales, dtype: float64
* 교재 chapter upsampling example을 적용하면 1월에 266개를 판매하였는데
1월 1일 - 1월 31일을 누적합이 266개가 되는 것이 아니라 266개~ 2월달 145.9개로 점차 감소하게 된다.
원래 data에서는 1월달에 총 판매갯수가 266개인데 예제를 실행하면 2000개가 넘게 판매되는 것으로 총 판매갯수가 달라진다.
* 예제는 upsampling을 통해 빈도수를 늘리고(다른 dataset과 frequency를 맞추기 위해) 기존 dataset의 전체적인 흐름만 맞출 뿐 이전 데이터의 특성을 온전히 가진채로 변형(보간)시킨 것이 아니라고 할 수 있다.
* 여기서 이전 데이터의 특성을 온전히 가진 채로(1월의 data를 31개로 나누어도 31개의 data를 합치면 1월의 data크기와 똑같이) 보간을 하고 싶어 새로운 코드를 짜봤다.
import numpy as np
from pandas import Grouper
from pandas import concat
from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
def random_interpolate(max_day,max_value):
list=[]
mean=max_value/max_day #평균적인 값 구하기
while len(list)<max_day:
list.append(np.random.randn(1)+mean) #평균적인 값을 평균으로 하는 가우시안 분포에서 랜덤으로 일수만큼 data 출력
diff=abs(sum(list)-max_value)/max_day
if np.all(sum(list)>max_value):
for i in range(max_day):
list[i]=list[i]-diff
elif np.all(sum(list)<max_value):
for i in range(max_day):
list[i]=list[i]+diff
return list
# upsample to daily intervals with spline interpolation
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, index_col=0, parse_dates=True,squeeze=True, date_parser=parser)
max_value=[]
max_value.append(series.values)
upsampled = series.resample('D').mean()
groups=upsampled.groupby(Grouper(freq='M'))
max_day=[]
for x in groups:
max_day.append(x[0].day)
end=[]
for x in range(len(series)):
end.append(random_interpolate(max_day[x],max_value[0][x]))
s=0
for x in range(31):
s=s+end[35][x]
end[35]=[s]
total=[]
for month in range(35):
for day in range(max_day[month]):
total.append(end[month][day])
total.append(end[35])
for i in range(1064):
upsampled.values[i]=total[i]
upsampled.plot()
pyplot.ylim([0,30])
pyplot.show()
print(upsampled.head(32))
print(sum(upsampled.head(31)))
Month
1901-01-01 9.151497
1901-01-02 8.531876
1901-01-03 7.780083
1901-01-04 10.001990
1901-01-05 7.038002
1901-01-06 8.632475
1901-01-07 8.691667
1901-01-08 8.401277
1901-01-09 9.012176
1901-01-10 8.597341
1901-01-11 7.626213
1901-01-12 7.609607
1901-01-13 8.803729
1901-01-14 9.849563
1901-01-15 8.696110
1901-01-16 8.002631
1901-01-17 8.882527
1901-01-18 9.116520
1901-01-19 7.091897
1901-01-20 9.250274
1901-01-21 8.220990
1901-01-22 9.273420
1901-01-23 8.784447
1901-01-24 8.238386
1901-01-25 9.371051
1901-01-26 8.198282
1901-01-27 7.352634
1901-01-28 9.314584
1901-01-29 9.615612
1901-01-30 8.587690
1901-01-31 8.275449
1901-02-01 5.891382
Freq: D, Name: Sales, dtype: float64
266.0
* 위의 새로운 코드를 실행하면 1월달의 data 누적 합은 266으로 원래 dataset의 data와 같은 결과를 보이며
전체적인 흐름 (trend) 또한 같은 모습을 보인다.
* 원래 dataset이 샴푸 판매량에 대해 나타낸 것이므로 자연현상과 가장 연관되어있는 가우시안분포를 통해 랜덤하게 매일 몇 개씩 팔렸는가를 추출하였다.
Autocorrelation
* Autocorrelation plot에서도 왜 다른 년도이지만 같은 날짜에 data와의 상관관계가 년도가 지남에 따라 낮게 나타나는 지 궁금하였다. 단순한 Autocorrelation을 비교하기 위해 예를 들어
2000년 1월1일의 data와 2001년 1월1일의 data, 2010년 1월1일의 data를 autocorrelation을 비교하면 거의 같은 값이 나와야 하기 때문이다.
* 그래프에 적용된 식을 찾아보면 이런 식으로 표현된다는 것을 알 수 있다.
* 같은 날짜임에도 불구하고, 비슷한 값인데도 불구하고 autocorrelation이 년도에 따라 점차 감소하며 파동을 그리는 이유는 년도가 지남에 따라 다른 날짜들도 sigma에 의해 연산이 수행되기 때문이다.
* 따라서 2000년 1월1일의 data와 2010년 1월1일의 data를 비교한다고 하였을 때 아무리 같은 값이라도
2000년 1월1일~2009년 12월31일의 data까지 연산에 관여하기에 결과값은 낮게 나온다.
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 9. Moving Average Smoothing (0) | 2021.07.12 |
---|---|
Chapter 8. Power Transforms (0) | 2021.07.12 |
Chapter 7. Resampling and Interpolation (0) | 2021.06.14 |
Chapter 6. Data Visualization (0) | 2021.05.27 |
Chapter 5. Basic Feature Engineering (0) | 2021.05.20 |