본문 바로가기
IT_프로그래밍

[파이썬] 추세 제거 뭐요? 어케 구하는ㄷ... detrend로 해결하자

by 째까 2023. 8. 21.
반응형

안녕하십니까? 째까입니다.

시계열 자료 분석할 때, 특히 기후 관련 분석할 때 많이 듣는 말 있으시죠?

"추세 제거 한걸로 비교해야 할껀데요."

"시간이 반영된거니 제거해야할 꺼에요."

등등..

째까는 기상, 환경 분야에서만 활동했고 기후 연구는 처음이라 대체 뭔소린지 ; 

무튼 detrend는 선형 회귀에 노이즈를 제거한다 뭐 이런건데요.

저는 시간 vs 기온 자료로 분석할 것이니 

예상 분석 과정은 poly1d로 추세선을 구한다 -> 추세선에 값의 갯수만큼 넣어 추세 값을 구한다 -> 기온 값 - 추세 값을 한다. 

라고 생각했습니다?

아니 근데 이게 잘 안되는거에요 ;

화나서 얘를 어쩌지 이러고있다가 문득 구글에 쳐봤는데 scipy에 detrend라는 함수가 있다고하네요? ㅎ... 존빡+환희

자 해봅시다.

 

사용한 자료는 NOAA global anomaly 웅앵입니다. 링크 걸어둡니다요.

 

전구 자료이니 lon, lat 차원을 없애야겠죠? 

평균하여 없애고 시간과 변수(air)만 남겨뒀습니다!

 

lon, lat 평균하는 것은 아래 블로그 참고해주세요!

2023.08.20 - [파이썬] 전구 자료 위경도 평균해보자! 추세선까지 그려보자!

 

[파이썬] 전구 자료 위경도 평균해보자! 추세선까지 그려보자!

안녕하세요? 째까입니다. 이번 파이썬 과정은 전구 자료를 가지고 x축은 시간, y축은 기온 자료로 시계열 그래프를 만들어 보는 것입니다! 자료는 NCEP-NCAR Reanalysis 1 자료를 사용했구요? monthly 자

jjaekka.tistory.com

 

detrend는 위 글에서 조금만 더 추가하면됩니다!

필요한 라이브러리는 이전 글과 동일합니다!

def check_poly_plot(temp_nc, sst_nc):
    global lwhpa, hihpa, wnt, smr, daou_path
    wnt_temp_ds = weights_var(temp_nc, syy, eyy, wnt, lwhpa, hihpa)
    wnt_time = wnt_temp_ds["year"]
    wnt_temp = wnt_temp_ds["air"]
    wnt_temp2 = signal.detrend(wnt_temp) # a


    
    wnt_x2, wnt_orig_temp, wnt_orig_reg = cal_time_poly(wnt_temp_ds)
    wnt_x2, wnt_diff_temp, wnt_diff_reg = cal_time_poly(wnt_temp_ds, "True")

    fig1, ax1 = plt.subplots(figsize = (14, 8))
    ax1.plot(wnt_time, wnt_orig_temp, color = "r", label = "Origin")
    ax1.plot(wnt_time, wnt_orig_reg(wnt_x2), color = "r", linestyle = "--")

    ax1.plot(wnt_time, wnt_diff_temp, color = "b", label = "Detrended")
    ax1.plot(wnt_time, wnt_diff_reg(wnt_x2), color = "b", linestyle = "--")
    ax1.set_xlabel("Year")
    ax1.set_ylabel("1000 hPa - 50 hPa temperature")
    ax1.set_ylabel("Temperature")
    ax1.set_title("Detrended example(DJF)")
    ax1.legend()

    plt.tight_layout()
   
    plt.show()

여기서 이번 글의 핵심은 wnt_temp2인데요

scipy안에 detrend를 이용해서 air를 넣으면

알아서 시간 변화를 제거합니다... 괜히 빼고 난리쳤죠 전 ㅎ...

빼고 난리치는건 밑에 함수 보시면됩니다!

def cal_time_poly(nc, diff = "False") :
    x = nc["year"]
    x2 = np.arange(1, len(x)+1)
    x3 = np.arange(len(x))
    y = nc["air"]

    z = np.polyfit(x2, y,1).round(2)
    pred = np.poly1d(z)

    if diff == "False" :
        return x2, y, pred

    diff_value = []
    if diff != "False" :
        for i in x3 :
            polied = pred(i)

            diff = y[i] - polied
            diff_value.append(diff)
        z = np.polyfit(x2, diff_value, 1).round(2)
        pred = np.poly1d(z)


        return x2, diff_value, pred

무튼 빼고 난리친걸  그림 그리면!

 

이렇게 변화하는 걸 볼 수 있습니다!

detrend한 것도 이런식으로 하실 수 있어요 ㅎㅎ...


 

코딩에 참고되길 바랍니당

 

그럼 이만!

반응형

댓글