Python에서 **kwargs는 키워드 인수를 나타내는 매개변수입니다. 이 매개변수를 사용하면 함수에 정해진 수의 키워드 인수가 아닌 임의의 수의 키워드 인수를 전달할 수 있습니다.
def plotSineWave(amp, freq, endTime, sampleTime, startTime, bias):
"""
plot sine wave
y = a sin(2 pi f t + t_0) + b
"""
time = np.arange(startTime, endTime, sampleTime)
result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias
plt.figure(figsize=(12,6))
plt.plot(time, result)
plt.grid(True)
plt.xlabel('time')
plt.ylabel('sin')
plt.title(str(amp) + "sin(2*pi" + str(freq) + "*t + " + str(startTime) + ")+" +str(bias))
plt.show()
다음과 같이 사인함수를 나타내는 함수가 있다고 가정하였을 때 선언해야하는 변수가 5개나 되고 순서를 기억해야한다고 생각하면 끔찍한데 **kwargs를 사용하면
def plotSineWave(**kwargs):
"""
plot sine wave
y = a sin(2 pi f t + t_0) + b
"""
amp = kwargs.get('amp', 1)
freq = kwargs.get('freq', 1)
endTime = kwargs.get('endTime', 1)
sampleTime = kwargs.get('sampleTime', 0.01)
startTime = kwargs.get('startTime', 0)
bias = kwargs.get('bias', 0)
figsize = kwargs.get('figsize', (12, 6))
time = np.arange(startTime, endTime, sampleTime)
result = amp * np.sin(2 * np.pi * freq * time + startTime) + bias
plt.figure(figsize=(12,6))
plt.plot(time, result)
plt.grid(True)
plt.xlabel('time')
plt.ylabel('sin')
plt.title(str(amp) + "sin(2*pi" + str(freq) + "*t + " + str(startTime) + ")+" +str(bias))
plt.show()
기본값으로 값들을 가지고 있다가 선언되는 값이 없으면 기본값으로 함수를 실행하도록 하는 기능을 수행한다.
시계열 데이터 분석
time = np.linspace(0, 1, 365 * 2)
result = np.sin(2 * np.pi * 12 * time) + time
ds = pd.date_range('2021-01-01', periods=365*2, freq='D')
df = pd.DataFrame({'ds': ds, 'y':result})
df['y'].plot(figsize=(10,6))
linspace로 2년치의 균일한 값을 만들어 내어 이것을 이용하여 sin함수를 만들어 내어 데이터프레임으로 만들어주고
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df);
오늘 새로 배운 Prophet으로 m에 시간데이터와 sin값을 학습시켜줍니다.
이렇게 하고
future = m.make_future_dataframe(periods =30)
forecast = m.predict(future)
30일치의 미래를 예측해줍니다.
pinkwink_web = pd.read_csv('../05. forecast/data/05_PinkWink_Web_Traffic.csv',
encoding='utf-8',
thousands=',',
names=['date', 'hit'],
index_col=0
)
pinkwink_web = pinkwink_web[pinkwink_web['hit'].notnull()]
pinkwink_web.plot(figsize=(12,4),grid=True)
빈 값을 제외하고 전부 불러와줍니다.
time = np.arange(0, len(pinkwink_web))
traffic = pinkwink_web['hit'].values
fx = np.linspace(0, time[-1], 1000)
trend 분석을 시각화하기위한 x축 값 만들기
# 에러계산 함수
def error(f, x, y):
return np.sqrt(np.mean((f(x) - y) ** 2))
예측값을 만들에 앞서 예측값과 실제값의 오차가 얼마나 나는지를 확인하기 위해 오차값 계산 함수를 선언해줍니다.
fp1 = np.polyfit(time, traffic, 1)
f1= np.poly1d(fp1)
f2p = np.polyfit(time, traffic, 2)
f2= np.poly1d(f2p)
f3p = np.polyfit(time, traffic, 3)
f3= np.poly1d(f3p)
f15p = np.polyfit(time, traffic, 15)
f15= np.poly1d(f15p)
1차, 2차, 3차, 15차 함수를 각각 만들어줍니다.
plt.figure(figsize=(12, 4))
plt.scatter(time, traffic, s=10)
plt.plot(fx, f1(fx), lw=4, label='f1')
plt.plot(fx, f2(fx), lw=4, label='f2')
plt.plot(fx, f3(fx), lw=4, label='f3')
plt.plot(fx, f15(fx), lw=4, label='f15')
plt.grid(True, linestyle='-', color='0.75')
plt.legend(loc=2)
plt.show()
df = pd.DataFrame({'ds':pinkwink_web.index, 'y':pinkwink_web['hit']})
df.reset_index(inplace=True)
df['ds'] = pd.to_datetime(df['ds'], format='%y. %m. %d.')
del df['date']
df.head()
날짜데이터를 Prophet에 넣을수 있도록 형식을 바꿔줍니다.
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df);
학습시켜주고
future = m.make_future_dataframe(periods=60)
60일치의 트레픽을 예측합니다.
예측값
m.plot_components(forecast)
차수별 데이터 값