데이터 스쿨 7주차 학습내용 정리 - 1

호진·2023년 12월 11일
0

AI_스쿨

목록 보기
27/51
post-thumbnail

**kwargs

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 홈페이지 트레픽 예측하기

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)


차수별 데이터 값

전체코드

전체코드

profile
중요한 건 꺽였는데도 그냥 하는 마음

0개의 댓글