파이썬/metpy

작업18: Metpy로 단위 달아보기 (metpy.units)

이석사 중 2023. 1. 10. 02:52
728x90

오늘부터는 대기과학에서 많이 사용하는 라이브러리인 Metpy를 이용해보려고 합니다

 

기상자료개방포털에서 자료도 직접 가지고 와서 SkewT log-p diagram 같은 그림들을 시각화해보고 분석도 해보겠습니다

 


우선 Metpy라는 라이브러리가 무엇인지 알아야합니다

 

공식 홈페이지에 나와있는 내용으로는

 

"기상 데이터를 읽고 시각화하고 계산을 수행하기 위한 도구 모음" 이라고 나와있습니다

 

대기과 학생인 저한테는 딱 맞는 라이브러리죠??

 

데이터를 읽고 시각화하는 건 그렇다고 쳐도 계산을 수행하는 도구는 다른 라이브러리에도 있는데 왜 또 

 

포함하고 있고 기상 데이터를 계산한다고 하는 걸까요?

 

그 이유는 Metpy는 단위를 가지고 게산을 수행하기 때문입니다

 

이 단위가 단순히 문자열로 붙여주는 것을 떠나서 

 

기압이면 1000hPa로 온도면 10℃로 저장을 하고 계산을 수행합니다

 

그렇기 때문에 단위 변환도 가능합니다!!

 

직접 해볼까요??


import numpy as np
import matplotlib.pyplot as plt

import metpy.calc as mc 
from metpy.units import units

먼저 metpy는 numpy랑 짝궁처럼 항상 같이 사용합니다

 

24시간 치 온도 자료가 있으면 0시부터 11시까지 24개의 자료가 존재합니다

 

이 값들에 각각 단위를 곱해줘야 계산을 하기 때문에 리스트보다는 array 형태로 많이 사용합니다

 

예시로 들어보면

각 시간대 별 기온이라고 해보겠습니다

 

만약에 10일 기온이 9일보다 얼마나 추운지를 비교하려면 00시는 00시끼리, 01시는 01시끼리 비교를 해야하기 때문에

 

개별 연산이 되지 않는 리스트보다는 array 형태로 많이 사용합니다

 

그래서 라이브러리 불러오는 과정에서 numpy와 같이 불러오는 경우가 많습니다


import metpy.calc as mc 
from metpy.units import units

대기와 관련된 값들을 게산할 때 2가지 상태로 나눠서 계산하는 경우가 많습니다

 

건조한 경우와 습윤한 경우 이렇게 2가지 입니다

 

metpy는 대기과학을 위한 라이브러리인 만큼 건조, 습윤계 열역학을 따로 구성해 두었습니다

 

metpy.calc가 이 기능들을 지원합니다

 

밀도나 지위고도, 상대습도, 이슬점 온도 같은 다양한 값들을 계산해주기 때문에 정말 유용합니다

 

metpy.units은 단위를 달아주는 라이브러리입니다

 

단위를 영어로 unit이라고 합니다

 

이정도까지 라이브러리 설명을 하고 이제 직접 사용해보겠습니다!


값에 단위를 달아주는 방법은 2가지가 있습니다

 

1. array에 단위를 곱하는 경우 (units.meters, units.sec 같은 단위를 직접 곱함)

2. Quantity를 이용해서 단위를 달아주는 경우

(units.Quantity(np.arange(0,5,1), 'sec') 형태로 단위를 문자열처럼 입력이 가능함)

 

먼저 단위를 직접 곱하는 방식부터 보겠습니다

distance = np.arange(1, 5) * units.meters

np.arange를 사용해서 1,2,3,4 총 4가지 숫자를 만들었습니다

 

arange로 만들었기 때문에 array 형태로 만들어졌겠죠??

 

다음은 units 라이브러리를 이용해서 단위를 직접 곱해줍니다

 

길이를 만들어보기 위해서 units.meters를 곱해줬습니다

 

값과 데이터 타입을 같이 출력해보면

출력은 리스트처럼 되어 있지만 1meter, 2meter, 3meter, 4meter로 되어 있는겁니다!

 

나중에 계산을 해보면 알 수 있습니다

 

type은 pint.util.Qunatity로 나온게 보이실 겁니다

 

제가 앞에서 선형 회귀 분석 적합성 검사 라이브러리를 만들때 언급드렸었는데

 

라이브러리 내에 라이브러리가 포함이 가능하다고 했었습니다

 

pint 역시 단위를 달아주는 라이브러리 입니다

 

기상 데이터 계산을 위헤 metpy라는 라이브러리 안에 포함되서 사용중인거죠

 

이제 값하고 단위를 곱해주는 방식도 사용해봤으니 units.Qunatity도 사용해볼까요??


time = units.Quantity(np.arange(2, 10, 2), 'sec')
#Q는 무조건 대문자!!

units.Quantity는 units.Quantity(데이터, 단위(반드시 문자열 형태))로 사용합니다

 

여기서 중요한 점은 단위를 반드시 문자열로 입력해줘야 한다는 점입니다

 

길이면 'meter', 시간이면 'sec' 이렇게 말입니다

 

코랩에서 출력을 할 때 print(distance) 이렇게 출력하면 

요렇게 나오고 

 

그냥 변수명만 불러왔을 때는 

이렇게 출력이 되더라구요

 

Magnitude는 크기라는 뜻입니다

 

시간이란 단위가 제대로 붙은 모습이죠??


다음은 연산입니다

 

기본적인 단위가 다른 값들은 더하거나 빼는 과정은 불가능합니다

 

곱하거나 나누거나 해서 밖에 만들지 못하죠

 

속도의 단위 m/s도 meter/second로 만드는 것처럼여

 

units를 이용해서 단위를 달아줬으면 연산도 가능합니다!

distance/time

이렇게 실행을 하면

요렇게 출력이 됩니다

 

units를 보면 meter/second로 잘 출력이 된 모습니다

 

곱하는 것도 똑같습니다

distance * distance

이렇게 해주면

넓이 단위인 ㎡로 units가 만들어진 모습입니다


이렇게 단위를 다는 작업들은 꼭 대기과학이 아니어도 유용하게 사용이 가능할 거 같다고 생각합니다

 

물리나 화학에서 쓰는 단위들도 다수 존재합니다

 

에너지나 일의 단위은 J도 있는 것처럼 말이죠

 

다음 포스팅은 단위 환산과 온도 단위도 다뤄보겠습니다

 

긴 글 읽어주셔서 감사합니다!!

728x90