pbj0812의 코딩 일기

[통계학] SkillMetrics(python) 을 통한 테일러 다이어그램 그리기 본문

Science/통계학

[통계학] SkillMetrics(python) 을 통한 테일러 다이어그램 그리기

pbj0812 2021. 1. 13. 01:46

0. 목표

 - SkillMetrics(python) 을 통한 테일러 다이어그램 그리기(예제 따라하기)

1. 설치

pip install SkillMetrics

 - 기본 사용법

import skill_metrics as sm
sm.taylor_diagram()

 - 옵션(링크)

2. 데이터 다운로드

 1) github.com/PeterRochford/SkillMetrics/blob/master/Examples/taylor_data.pkl 에서 다운로드

 2) 데이터 확인

  - 실습 PC 에서는 인코딩 문제로 아래와 같이 코드를 짜야 파일을 열 수 있음

  - 해양 or 기상 관련 데이터로 보임

import pickle

class Container(object): 
    def __init__(self, pred1, pred2, pred3, ref):
        self.pred1 = pred1
        self.pred2 = pred2
        self.pred3 = pred3
        self.ref = ref

with open('/Users/pbj0812/Desktop/jupyter_notebook/data/taylor_data.pkl', 'rb') as f:
    data =  pickle.load(f, encoding="latin1") 

  - data 에는 pred1, pred2, pred3, ref 가 아래와 같은 json을 닮은 형태로 저장되어 있음

3. 실습(원본 코드)

 1) library 호출

import matplotlib.pyplot as plt
from matplotlib import rcParams
import numpy as np
import pickle
import skill_metrics as sm
from sys import version_info

 2) 하단의 주석 처리된 부분은 원본

def load_obj(name):
    # Load object from file in pickle format
    suffix = 'pkl' 
    with open(name + '.' + suffix, 'rb') as f:
        return pickle.load(f, encoding="latin1") 
    #with open(name + '.' + suffix, 'rb') as f:
        #return pickle.load(f) # Python2 succeeds

 3) 데이터 분리

  - 해당 부분을 실행하지 않을 경우 아랫 부분에서 에러 발생

class Container(object): 
    def __init__(self, pred1, pred2, pred3, ref):
        self.pred1 = pred1
        self.pred2 = pred2
        self.pred3 = pred3
        self.ref = ref

 4) 실행

if __name__ == '__main__':

    # 플롯 조정
    rcParams["figure.figsize"] = [8.0, 6.4]
    rcParams['lines.linewidth'] = 1 # line width for plots
    rcParams.update({'font.size': 12}) # font size of axes text
    
    # 열려있는 그림 창 종료
    plt.close('all')

    # 데이터 확보
    data = load_obj('/Users/pbj0812/Desktop/jupyter_notebook/data/taylor_data')

    # Calculate statistics for Taylor diagram
    # The first array element (e.g. taylor_stats1[0]) corresponds to the 
    # reference series while the second and subsequent elements
    # (e.g. taylor_stats1[1:]) are those for the predicted series.
    taylor_stats1 = sm.taylor_statistics(data.pred1,data.ref,'data')
    taylor_stats2 = sm.taylor_statistics(data.pred2,data.ref,'data')
    taylor_stats3 = sm.taylor_statistics(data.pred3,data.ref,'data')
    
    # Store statistics in arrays
    sdev = np.array([taylor_stats1['sdev'][0], taylor_stats1['sdev'][1], 
                     taylor_stats2['sdev'][1], taylor_stats3['sdev'][1]])
    crmsd = np.array([taylor_stats1['crmsd'][0], taylor_stats1['crmsd'][1], 
                      taylor_stats2['crmsd'][1], taylor_stats3['crmsd'][1]])
    ccoef = np.array([taylor_stats1['ccoef'][0], taylor_stats1['ccoef'][1], 
                      taylor_stats2['ccoef'][1], taylor_stats3['ccoef'][1]])

    sm.taylor_diagram(sdev,crmsd,ccoef)

    # 그림 저장
    plt.savefig('taylor1.png')

    # Show plot
    plt.show()

 5) 결과

3. 참고 

 - Converting Python 2 Pickles to Python 3

 - Taylor Diagram Options

 - PeterRochford/SkillMetrics

Comments