< def > 함수 정의
- return(결과값이 있어야 저장후 활용가능)
- global(global 변수를 def 내에서 사용하고 싶다면 global로 선언)
- """ : ((shift+tab) Docstring)정의한 def함수를 설명 호출할 때 표현
- 키워드argument '**' :기본값이 디폴트되어 있고 사용자 지정도 가능
# 마크다운으로 '$$' 수학수식 적기
$$ y = asin(2\pi ft + t_0)+b $$
def plotSinWave(**kwargs):
"""
plot sin wave
y = a sin(2 pi ft + 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.show()
plotSinWave(amp=2, freq=0.5, endTime=10)
- 사용자가 만든 def함수 import모듈 ->.py파일로 만들기
- jupyter notebook에 바로 (.py)파일 만들기: %%writefile ./drawSinWave.py
- 직접 터미널에서 실행가능
- %matplotlib inline은 실행안됨- if name == "main":
Time Series Data(시계열 데이터)?
: 시간의 흐름에 대해 특정 패턴, 주기성과 같은 정보를 가지고 있는 경우
(cf.'머신러닝'같은 경우 시간을 특성으로 잡히지 않음)
대부분 Forecast ( 먼저 Trend를 찾고, Trend를 뺀 주기적 특성을 찾음. )
그중 Prophet은 단지 예측과 분석하는 데 맛보기로 쓸만한 모듈(주기성이 좋을수록 예측정확도가 높아짐)
import matplotlib.pyplot as plt
%matplotlib inline
from prophet import Prophet
: 2년간의 sin특성을 가진 데이터
time= np.linspace(0,1,365*2)
result= np.sin(2*np.pi*12*time) #sin함수
ds= pd.date_range('2018-01-01', periods=365*2, freq='D') #2년간의 날짜데이터
df= pd.DataFrame({'ds':ds, 'y':result})
: 연(year) 주기성, 일(daily) 주기성이 있는 데이터 (cf.자연상태는 여러 주기가 나타남)
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df)
# df을 Prophet에서 학습 후 변수m에 저장
: 이후 30일간을 예측 & 그래프 그리기
future = m.make_future_dataframe(periods=30)
forecast = m.predict(future)
# 예측값을 forecast변수에 저장
m.plot(forecast);
# plot이 리턴해준 객체도 마찬가지로 그려주는 역할을 하기 때문에 세미콜론을 사용하면 후자를 막음
result= np.sin(2*np.pi*12*time) + time
result= np.sin(2*np.pi*12*time) + time + np.random.randn(365*2)/4
pinkwink 블로그의 방문자 수 시계열 분석
import pandas as pd
import pandas_datareader as web
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from prophet import Prophet
%matplotlib inline
# trend 분석을 시각화하기 위한 x축 값 만들기
time = np.arange(0, len(pinkwink_web)) #배열형태로 데이터(0~365)
traffic = pinkwink_web['hit'].values
fx = np.linspace(0, time[-1], 1000) #1차열배열을 만듬(0~364,1000개)
# 에러를 계산할 함수
def error(f, x, y):
return np.sqrt(np.mean((f(x) - y) ** 2)) # 표준편차? (fx - 원래값) sqrt루트
fp1 = np.polyfit(time, traffic, 1) # 1차식
f1 = np.poly1d(fp1)
# 2차식(2차원)~ 다양하게 만들 수 있고 몇 차식을 트랜드로 볼지는 디자이너 몫
- error함수 확인 결과 1~3차식까지 큰 차이가 없으나 15차식에서 실제값과의 함수와의 차이가 적은 것을 확인할 수 있다
(->트랜드를 자세히 분석이 필요하면 높은 차식 이용)
m = Prophet(yearly_seasonality=True, daily_seasonality=True)
m.fit(df); # ;이 없어도 됨
# 60일간에 해당하는 데이터 예측
future = m.make_future_dataframe(periods=60)
# 예측 결과는 상한/하한의 범위를 포함해서 얻어짐
forecast = m.predict(future)