반응형

     정보

    • 업무명     : 2017년 2학기 전선 기상 정보학 실습 및 과제물

    • 작성자     : 이상호

    • 작성일     : 2020-03-21

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.  

    • 오늘은 대학원 석사 4학기에 배운 기상 정보학에 대한 내용을 다루고자 합니다.

    • 이 교과목은 주로 파이썬 (Python)를 이용한 기초 및 활용 (기상 자료 처리 및 가시화)를 내포하고 있습니다.

    • 특히 배운 지식를 활용하여 각 주차별 발표 및 토의는 학술 논문 또는 보고서를 작성 시 많은 도움이 되었습니다.  

    • 오늘 포스팅에서는 기상 정보학의 실습 및 과제물을 소개해 드리고자 합니다. 

     

    [특징]

    • 기상정보학 수업에 대한 이해를 돕기위해 작성

     

    [기능]

    • 실습

    • 과제물

      • 강릉원주대 (Gangneung-Wonju National University, GWNU) 복사 관측소 (Radiation Observation Station)를 이용하여 자료 읽기 및 저장

      • 지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기

      • GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출 

      • 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석

     

    [사용 OS]

    • Windows 10

     

    [사용 언어]

    • Power Point 2018

    • Python v2.7.3

     

     실습

    • 실습에 필요한 패키지 목록

    cdat-5.2.tar.bz2
    EasyNC.tgz
    2.12.yml
    hdf5-1.8.19-linux-centos7-x86_64-gcc485-shared.tar.gz
    netcdf-c-4.4.1.1.tar.gz
    netcdf-fortran-4.4.4.tar.gz
    pyqt-4.11.3-py27_1.tar.bz2
    PyQt-x11-gpl-4.11.3.tar.gz
    qt-everywhere-opensource-src-4.8.6.tar.gz
    
    

     

    • 실습에 필요한 도구 목록

    putty-0.70-installer.msi
    putty-64bit-0.70-installer.msi

     

    텍스트 파일 읽기/쓰기 (open, readline, print, write, close) 
    abc = raw_input()
    abc
    abc = raw_input("model name?")
    
    f = open("새파일.txt", "w")
    f.close()
    
    food = "python\'s favorite food is perl"
    print(food)
    "I eat %d apples." % 3
    "pi is %10.6f" %3.141592
    3*("%f10.2") %(-1.0, -2.9, -3.0)
    2*("%f4.0") %(-1.0, -2.9)
    
    ## Test
    f = open("rain.txt", "w")
    rain_seoul = range(0, 999, 3) 
    rain_busan = range(0, 999, 33) 
    rain_gangneung = range(0, 999, 100)
    year = range(2011, 2018)
    
    for i in range(7):
       writeline = 4*("%4d") %(year[i], rain_seoul[i], rain_busan[i], rain_gangneung[i])
       f.write(writeline+"\n")
    f.close()
    
    f = open("rain.txt", "r")
    #id = f.readline()
    for i in range(6):
    #for year in range(2011, 2017):
       adata = f.readline()
       list_a=adata.split()
       print list_a[0], list_a[1], list_a[2], list_a[3]
    f.close()
    
    dd = df.to_csv("rain.txt")
    fname = "gwnu_precip.txt"
    fname.replace('precip', 'temp')
    
    start_year = 1991
    end_year = 2010
    fname = 'pr_'+str(start_year)+str(end_year)+'.txt'
    
    yyyymm = str(2015)+str(9).zfill(2)
    print(yyyymm)

     

    NumPy와 배열 만들기
    #  http://aikorea.org/cs231n/python-numpy-tutorial/
    
    
    import numpy as np
    #   numpy를 load하고 닉네임을 np로 부여
    #   np.function
    #   numpy.function
    
    from numpy import *
    #   패키지 내에 모든 function을 불러옴
    
    from numpy import 함수명
    #   numpy내에서 특정 function만 불러옴
    
    ########################################
    
    alist=[[1,2,3],[4,5,6]]
    alist[0][1]
    
    #   list내에 list 형태
    
    aaa = np.array(alist)
    aaa[0,1]
    #   배열 형태
    
    aaa.shape       #   배열 형태       
    aaa.ndim       #   차원      
    aaa.size        #   크기
    
    ########################################
    #   파일에서 데이터를 읽어올때는 초기화 필요(선언) 
    #   aaa = np.arry()  
    
    a = np.zeros((2,2))         # 모든 값이 0인 배열 생성
    print a                   # 출력 "[[ 0.  0.]
                            #       [ 0.  0.]]"
    
    b = np.ones((1,2))          # 모든 값이 1인 배열 생성
    print b                   # 출력 "[[ 1.  1.]]"
    
    
    c = np.full((2,2),7)         # 모든 값이 특정 상수인 배열 생성
    print c                   # 출력 "[[ 7.  7.]
                             #       [ 7.  7.]]"
    
    d= np.eye(2)               # 2x2 단위행렬 생성
    print d                    # 출력 "[[ 1.  0.]
                              #       [ 0.  1.]]"
    
    e = np.random.random((2,2))   # 임의의 값으로 채워진 배열 생성
    print e                     # 임의의 값 출력 "[[ 0.91940167  0.08143941]
                              #                  [ 0.68744134  0.87236687]]"
    
    
    f = np.empty((3,3))
    print f
    
    ##############################################################################
    
    
    aaa[:,:]
    aaa[:]
    aaa[0,:]
    aaa[-1,-1]
    
    
    type(aaa)
    aaa.dtype
    
    x = np.array([1, 2])                    # Numpy가 자료형을 추측해서 선택
    print x.dtype                         # 출력 "int64"
    
    x = np.array([1.0, 2.0])                # Numpy가 자료형을 추측해서 선택
    print x.dtype                        # 출력 "float64"
    
    x = np.array([1, 2], dtype=np.int64)    # 특정 자료형을 명시적으로 지정
    print x.dtype                      # 출력 "int64"
    
    #   x = np.array([[1,2],[3,4]], dtype=np.float64)
    #   y = np.array([[5,6],[7,8]], dtype=np.float64)
    
    
    ##############################################################################
    
    alist=[[1,2,3],[4,5,6]]
    aaa = np.array(alist)
    
    b=aaa.reshape([aaa.size])
    b
    dir(aaa)
    
    ###############################################################################
    
    import numpy as np
    
    x = np.array([[1,2],[3,4]], dtype=np.float64)
    y = np.array([[5,6],[7,8]], dtype=np.float64)
    
    
    
    print x + y
    print np.add(x, y)
    #   요소별 합; 둘 다 다음의 배열을 만듭니다
    #   [[ 6.0  8.0]
    #    [10.0 12.0]]
    
    
    print x - y
    print np.subtract(x, y)
    #   요소별 차; 둘 다 다음의 배열을 만듭니다
    #   [[-4.0 -4.0]
    #    [-4.0 -4.0]]
    
    
    
    print x * y
    print np.multiply(x, y)
    #   요소별 곱; 둘 다 다음의 배열을 만듭니다
    #   [[ 5.0 12.0]
    #    [21.0 32.0]]
    #   행렬 연산 아님, 단순 배열 요소간 곱
    
    
    print x / y
    print np.divide(x, y)
    #   요소별 나눗셈; 둘 다 다음의 배열을 만듭니다
    #   [[ 0.2         0.33333333]
    #    [ 0.42857143  0.5       ]]
    
    
    
    print np.sqrt(x)
    print x**0.5
    #   요소별 제곱근; 다음의 배열을 만듭니다
    #   [[ 1.          1.41421356]
    #    [ 1.73205081  2.        ]]
    
    ###############################################################################
    
    x = np.array([[1,2],[3,4]])
    
    print np.sum(x)             #   모든 요소를 합한 값을 연산; 출력 "10"
    print np.sum(x, axis=0)       #   각 열에 대한 합을 연산; 출력 "[4 6]"
    print np.sum(x, axis=1)       #   각 행에 대한 합을 연산; 출력 "[3 7]"

     

    EasyNC 및 CDAT 소개
    인스톨 가이드
    
    ncdf 4를 설치하려면 hdf5를 사용해야됨.  기본적으로 설치 되어 있음.
    c, c++, gfotran
    m4, zlib, (알집)
    
    sudo yum –y install gcc-g++
    sudo yum –y gcc-gfortran
    
    
    ## 4가지는 필수 필요한 방법.
    sudo yum –y install m4
    sudo yum –y install zlib-devel
    sudo syum –y install libcurl-devel
    Download hdf5 binary file  
    (https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.16/obtain51816.html)
    ## 자동 설치하지말고 집에서 다운로드 함.
    
    인스톨하기 전에 hdf5 
    자동으로 환경설정되는 부분
    /lib 
    /lib64
    /usr/lib
    /usr/lib64
    
    내가 자동으로 설정하여 설치파일
    /usr/local/lib
    /usr/local/netcdf
    
    include
    bin
    lib
    
    
    ## NeCDF 파일 설치하는 방법.
    READ INSTALL.md
    CPPFLAGS=“-I/usr/local/hdf5/include –I/usr/include/curl”
    ## 그 안에 폴더까지 있어서 설정할 필요가 있음.
    LDFLAGS=-L/usr/local/hdf5/lib ./configure —prefix=/usr/local/netcdf
    ## Libray 링크 해주는 부분.  이어서 한줄씩 이어서 설치하면 됨.
    ## 설치할 때 경로를 잡아서 설치해줄 필요가 있음.  prefix은 여러분 홈디렉토리에 설정하면됨.
    sudo make
    컴파일
    sudo make install
    컴파일 하면 오브젝트 파일이 생겨 이를 실행함.
    make check
    
    nctcdf_c를 설치하면 ncfcdf_forrtran을 설치한는 방법
    
    ## ncedf_fortran 설치 방법.
    CPPFLAGS="-I/usr/local/hdf5/include –I/usr/include/curl 
    -I/usr/local/netcdf/include" LDFLAGS="-L/usr/local/hdf5/lib 
    -L/usr/local/netcdf/lib" ./configure —prefix=/usr/local/netcdf
    sudo make
    sudo make install
    make check
    
    nc-config —all
    
    # tar.gz를 이용하여 버전을 맞춰서 설치할 필요가 있음.
    
    nc –config –-all을 설치하는 방법임.
    pgfortan , fflags, flibs을 EASYNC를 설치하는 방법
    
    
    EasyNC 설치방법.
    cd ../EasyNC
    
    rm –f *.mod *.o
    
    -g은 fortran 컴파일을 이용하여 디버깅할 때 쓰는 명령어.
    vi readmc 
    vi makefile : pgfortran, --flags을 이용함.  flibs은 nc_libfalss로 변환.
    컴파일을 위한 용도.
    vi Makefile.user :pgfortran , FFLAGS은 Fflags
    
    make만 하면됨.
    
    
    
    
    ls –l bin -> 바이너리 파일을 이용하여 써야됨.
    echo $SHELL
    vi ~/.bashrc: ## EastNC
                 export EasyNC = /data/guest00/programs/EasyNC
                 export PATH=$EasyNC/bin:${PATH}  이 시스템 환경 변수를 설정함.
    cd samples 
    cd data
    ncdump –h *
    ls ../../bin에서 
    which eznc_copy_att가 안나와서
    source ~./.bashrc을 하면 제대로 나옴.
    이것을 어디서도 쓸수가 있음.
    
    cp tas_ERA40_2000.nc t2m.nc
    ncdump –h t2m.nc
    eznc_rename t2m.nc t2m sat
    
    ####################################################
    cd cdat-5.2.cat
    ./
    
    
    
    # 페도라 자동 설치
    sudo yum –y install pyqt4 
    sudo yum –y install pyqt4-devel (devel은 개발자 모드)0
    export LD_LIBRARY_PATH=/usr/lib/gcc:${LD_LIBRARY_PATH}
    ## 자기 시스템 환경에 안맞아서 Error가 발생됨.  서로 버전가 상이하게 발생되어 문제가 발생됨.  
    conda create -n uvcdat-2.12 uvcdat -c conda-forge –c uvcdat
    환경변수가 설정되어됨.  conda은 새롭게 인스톨하게 하는 방법.  conda를 직접 다운로드 받아서 직접 설치 후 해야됨. 가이드라인 참고해야함.  pyqt4와 Netcdf가 많음.
    2.12를 개발자 사용했던 콘다 환경이 있음.  nctcdf 4.5은 오류가 발생하였으나 4.4.1은 발전 됨.  어떤 프로그램이 많아서 할 수가 없음. 
    
    cdat는0 CMIP에서 cmor를 통해 표준 데이터 환경을 변환해줌.
    (https://github.com/UV-CDAT)
    
    make install
    matplotlib 경우 따로 설치해야 됨. 설명서에 참조하여 설정.
    precip.mon.mean.nc 자료를 ver2.3을 이용하여 사용함.  데이터에 대한 정보를 갖고 있어야 됨.  2.5*2.5을 이용함.    Detailed Description + 사사 문구 사용.  Reference를 사용하고 미싱데이터 값. 사용함.  
    
    ncdump –h *.nc를 보면 해당 자료에 대한 정보가 자세히 나옴.  한 격자의 평균을 가지고 오나 buds은 격자 경계에 해당하는 부분.  좌우, 상하, 그대로 써야됨.  
    
    /data/guest00/cdat  test_cday 해보라는 방법임.
    
    LD_LIBRARY_PATH=/usr/local/netcdf/413_---eznc_rename t2m.nc latitude lat
    eznc_rename t2m.nc longitude lons
    eznc_copy_att: 새로운 파일에 대한 부가적인 정보를 복사.
    eznc_puy_att: 
    eznc_put_att t2m.nc global author hojeong_shin (개쩐다).
    256자 (2줄) 안넘기게 사용하면 됨.  2가지만 써도 필요함.  다른 응용 프로그램에서 축 이름 등 여러 가지를 바꿔야 됨. 
    샘플로 muifa_ysu 자료는 WRF 자료를 많이 따라서 해보는 것이 숙제 
    
    
    make clean이 잘 안될 경우 make claen all을 사용할 경우도 있음.
    우리나라 PGI는 crack 버전을 해주나 실제로는 정품도 함.  PGI는 GCC에 비해 좋으나 지금은 GCC 큰 차이가 없음.  GCC는 공짜임.  intel은 최적화에 능하기 때문에 유료임. 
    
    make –j8은 CPU의 개수에 따라서 실행해주는 명령어임.
    
    ###################################
    
    cdo -f nc copy programs/precip.mon.mean.nc gpcp.nc
    fortran90을 가지고 fortran 77 문법으로 이용하였으나  nc –config —all를 보면 netcdf fortran은 링크가 되어 있지 않아 발생된 오류임.
    netcdf 설치할 경우 fortran, c를 설치해야됨.  여러분 리눅스에 설치해야됨.
    
    netcdf 파일 처리할떄 cdat를 처리하는게 너무 편리함.
    UV-CDAT은 수많은 짬뽕이고 해당 모듈 및 설명서를 볼수가 있음. 
    이것도 EASYNC처럼 편리함.
    PDF 파일에서 
    long name 또는 standard name가 유사함.  Units은 켈빈으로 사용함.  위경도 값을 따로 알려줌.
    
    attributes.Keys()은 파이썬 딕션어리를 이용하여 리스트 해줌.
    MV2는 마스킹 기능이 파워풀함.
    cdms2는 크게 MV는 부가적인 정보를 추가 할수 있으나 자동으로 축 정보를 따라감.
    평균을 계산하면 다시 cdms2를 자동으로 추가됨.
    typecode=f(실수), d(배정도)
    
    MV2.float 32/64 
    np.float 32/64
    np.int
    MV2.int을 쓰지 않으면 float 64로 들어갈 것임.
    
    fill_value은 결측값.
    
    축 이름이 level을 읽을 수 있으나 그것이 안될 경우 getAxis(2)으로 설정하여 추출해야됨.
    평균을 할떄 MV2 모듈을 쓰는게 편함.  해당 정보가 그대로 따라옴.
    
    time 축에 대해서 축번 및 축값 쓰면 됨.  Missing 값은 새롭게 할 수 있음. 

     

    ## 원활한 기상정보학 수업을 위한 패키지 및 라이브러리 설치
    ## ncdf4를 설치하려면 hdf5를 사용해야됨. 기본적으로 설치 되어 있음.
    c, c++, gfotran
    m4, zlib, (알집)
    
    sudo yum –y install gcc-g++
    sudo yum –y gcc-gfortran
    
    ## 4가지는 필수 설치.
    sudo yum –y install m4
    sudo yum –y install zlib-devel
    sudo syum –y install libcurl-devel
    Download hdf5 binary file 
    (https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.16/obtain51816.html)
    
    ## 자동 설치하지말고 집에서 다운로드 함.
    인스톨하기 전에 hdf5 
    자동으로 환경설정되는 부분
    /lib 
    /lib64
    /usr/lib
    /usr/lib64
    
    ## 내가 자동으로 설정하여 설치파일
    /usr/local/lib
    /usr/local/netcdf
    
    include
    bin
    lib
    
    ## Netcdf 파일 설치하는 방법.
    READ INSTALL.md
    CPPFLAGS=“-I/usr/local/hdf5/include –I/usr/include/curl”
    
    ## 그 안에 폴더까지 있어서 설정할 필요가 있음.
    LDFLAGS=-L/usr/local/hdf5/lib ./configure —prefix=/usr/local/netcdf
    
    ## Library 링크 해주는 부분.  한줄씩 이어서 설치하면 됨.
    ## 해당 경로에 대해서 설치할 것을 추천함.  prefix은 홈디렉토리에 설정하면 됨.
    sudo make
    컴파일
    sudo make install
    컴파일 하면 오브젝트 파일이 생겨 이를 실행함.
    make check
    
    nctcdf_c를 설치하면 ncfcdf_forrtran을 설치해야 됨.
    
    ## ncedf_fortran 설치 방법.
    CPPFLAGS="-I/usr/local/hdf5/include –I/usr/include/curl 
    -I/usr/local/netcdf/include" LDFLAGS="-L/usr/local/hdf5/lib 
    -L/usr/local/netcdf/lib" ./configure —prefix=/usr/local/netcdf
    sudo make
    sudo make install
    make check
    
    nc-config —all
    
    ## tar.gz을 버전에 맞게 설치할 필요가 있음.
    
    nc –config –-all을 설치하는 방법임.
    pgfortan , fflags, flibs을 EASYNC를 설치하는 방법
    
    
    # EasyNC 설치방법.
    cd ../EasyNC
    rm –f *.mod *.o
    
    ## -g은 fortran 컴파일을 이용하여 디버깅할 때 쓰는 명령어임.
    vi readmc 
    vi makefile : pgfortran, --flags을 이용함. flibs은 nc_libfalss로 변환.
    ## 컴파일을 위한 용도임.
    vi Makefile.user :pgfortran , FFLAGS은 Fflags
    
    make만 하면됨.
    
    ls –l bin 		## 바이너리 파일을 이용하여 써야됨.
    echo $SHELL
    vi ~/.bashrc:	## EastNC
    export EasyNC = /data/guest00/programs/EasyNC
    export PATH=$EasyNC/bin:${PATH} 		## 이 시스템 환경 변수를 설정함.
    cd samples 
    cd data
    ncdump –h *
    ls ../../bin에서 
    which eznc_copy_att가 실행되지 않으면 ~/.bashrc에서 PATH 설정 후 source ~./.bashrc로 실행하면 됨.
    
    cp tas_ERA40_2000.nc t2m.nc
    ncdump –h t2m.nc
    eznc_rename t2m.nc t2m sat
    
    cd cdat-5.2.cat
    ./
    
    ## 페도라 자동 설치
    sudo yum –y install pyqt4 
    sudo yum –y install pyqt4-devel (devel은 개발자 모드)0
    export LD_LIBRARY_PATH=/usr/lib/gcc:${LD_LIBRARY_PATH}
    ## 자기 시스템 환경에 안맞아서 Error가 발생됨. 서로 버전가 상이하게 발생되어 문제가 발생됨. 
    
    conda create -n uvcdat-2.12 uvcdat -c conda-forge –c uvcdat
    ## 환경변수가 설정되어 됨.  conda은 새롭게 인스톨하게 하는 방법.  conda를 직접 다운로드 받아서 가이드라인을 참조하여 설치 해야 됨. 
    
    cdat는0 CMIP에서 cmor를 통해 표준 데이터 환경을 변환해줌.
    (https://github.com/UV-CDAT)
    
    make install
    ## matplotlib 등의 라이브러리는 최신 버전을 설치해야 됨. 
    precip.mon.mean.nc의 Header (ncdump –h precip.mon.mean.nc)는 사용되는 버전 및 공간 해상도 (2.5°×2.5°) 뿐만 아니라 사사 문구 및 Missing data 정보가 포함되어 있음.
    
    /data/guest00/cdat test_cday 해보라는 방법임.
    
    LD_LIBRARY_PATH=/usr/local/netcdf/413_---
    
    eznc_rename t2m.nc latitude lat
    eznc_rename t2m.nc longitude lons
    eznc_copy_att: 새로운 파일에 대한 부가적인 정보를 복사함.
    eznc_puy_att: 
    eznc_put_att t2m.nc global author hojeong_shin (개쩐다).
    ## 256자 이내로 코딩 할 것을 권고함. 
    ## Easync 폴더에 muifa_ysu 샘플 자료 (WRF 결과 파일)도 있으니 참고. 
    ## make clean이 안될 경우 make claen all을 사용할 것을 추천함.
    ## 이전에는 PGI 컴파일러 (상용 소프트웨어)는 GCC보다 성능이 좋으나 현재는 GCC (프리웨어)와 큰 차이가 없음.  PGI 및 GCC보다 Intel는 유료로서 모듈화 및 표준화에 대한 최적화에 유용함.
    ## make –j8은 CPU의 개수에 따라 실행해주는 명령어임.
    
    cdo -f nc copy programs/precip.mon.mean.nc gpcp.nc
    ## 실행시 오류가 발생될 경우 nc config —all을 보면 netcdf fortran가 링크 되어 있지 않아 발생된 오류임.
    ## Netcdf 설치할 경우 fortran, c이 설치되어 있어야 함. 
    ## UV-CDAT Utilities는 nc 파일을 처리할 때 유용하고 해당 모듈 및 설명서는 https://uvcdat.llnl.gov/index.html 참조하여 볼 수 있음.  특히 MV2 모듈은 마스킹에 파워풀한 기능을 가지고 MV2 모듈 중 cdms2는 자동 축 정보 추출 (해당 정보가 그대로 따라옴) 및 평균을 이용할 수 있음.
    ## 축 이름이 level로 읽을 수 있으나 혹여나 안될 경우 getAxis(2)으로 설정하여 추출해야 됨.
    
    ## 과제 : UV-CDAT Utilities를 이용하여 csv 파일을 읽고, 딕션어디로 축 정보를 정보를 이용하여 Ncdcdf 파일을 만들고 한번 따라서 해보기
    
    #!/bin/python
    
    #===============================================================================
    # Routine  : Main Python program
    #
    # Purpose  : gpcp_clim.py
    #          
    # Author   : Sang-Ho Lee 
    #
    # Revisions: V1.0 November 06, 2017 First release (S.-H. Lee)
    #===============================================================================
    
    ## user define
    # archive_root = 'data/guest00/data'
    archive_root = './'
    start_year = 1990;  end_year = 2016
    
    
    import cdms2, cdutil, MV2
    
    fin = cdms2.open(archive_root + '/gpcp.nc', 'r')
    fin.listvariables()
    
    pr = fin('precip')
    pr.shape
    
    
    pr.max()
    print(pr.min())
    
    pr.units
    pr.id
    pr.long_name
    
    pr.test = 'meteor_information'
    
    pr.info()
    
    # axes = pr.get.Ax
    # axes.shape
    # len(axes)
    
    time = pr.getAxis(0)
    time
    
    lats = pr.getAxis(1)
    lats
    
    lons = pr.getAxis(1)
    lons
    
    # pr.getTime()
    # pr.getLatitude()
    # pr.getLevel()
    
    pr_mean2 = MV2.average(pr, axis=0)
    pr_mean2.info
    
    
    pr1 = pr(time=('1979-1-1', '2016-12-31'))
    pr1.info
    
    pr_mean2 = MV2.average(pr1, axis=0)
    # pr_clim = cdutil.ANNUALCYCLE.climatology (pr)
    # 12 monthly mean
    
    pr.missing_value

     

    EasyNC 및 CDAT (cdms2, MV2, cdutill)를 이용하여 NetCDF 편집 및 읽기 (1)
    import cdms2, MV2, numpy as np (Python 라이브러리는 연달아 로드할 수 있음)
    ## cd softare/Easync에서 make 파일을 열면 export은 bash 환경변수 설정. 
    ## ls –l ../bin이 쓸면하면 Eznc_copy_att, eznc_put_att, eznc_rename이 쓸만함.
    ## samples 자료에서 t2m.nc (2m 지표면 기온)
    ## cdo (Netcdf 파일에서 원하는 기간에 대해 정보를 추출할 때 유용한 언어)
    ## cdo –selyear, 2000 precip.mon.mean.nc prec_GPCP_2000.nc (precip.mon.mean.nc에서 2000년일 때 GPCP 정보를 추출하여 prec_GPCP_2000.nc로 저장)
    ## ncdump –h prec_GPCP_2000.nc > HEAD (헤더파일 생성)
    
    ## Easync에서 주로 eznc_rename와 eznc_put_att 및 eznc_copy_att을 이용할 수 있음.
    ## lats, lons 축 이름이 자세하지 못해 이를 latitude, longitude로 변경함.
    eznc_rename t2m.nc lats latitude
    eznc_rename t2m.nc lons longitude
    ncdump –h t2m.nc (헤더파일 생성)ㅇㅇ
    
    eznc_put_att t2m.nc global class “meteo_info”
    eznc_put_att t2m.nc global class “information”
    eznc_copy_att t2m.nc 
    
    ## 연구에서 이용되는 자료는 주로 아스키 (csv, txt)와 바이너리 (bin) 및 과학기술포맷 (위성: hdf, h5; 위성 또는 기후모델: nc; 수치 모델: grib, grib2)로 사용되고 일반적으로 grib 및 hdf는 원도우 상에서 처리하기 어렵기 때문에 ncl_convert2nc를 이용하여 nc로 변경하여 사용함.
    
    #====================================================
    # test_get_var.f90
    #====================================================
    cp test_get_var.f90 read_prec.f90 (리눅스 상에서 파일 저장)
    vi read_prec.f90
    
    real, parameter :: mdays
    /31, 29, 31, 30, 31,30, 31, 31, 30, 31, 30, 31, 30, 31/
    varmean = 0.0
    do i=1, nt
    	Varmean = varmean + varin(:,:,i)*mdays(i)
    enddo
    varmean = varmean/12.0
    ## 시간에 따른 가중치를 고려하여 평균함.
    
    din = ‘/data/guest00/data/gpcp.nc’
    din = ‘/data/guest00/data’
    finname = din+’/gpcp.nc’
    fin = cdms2.open(finname, ‘r’)  
    fin.listvariables()
    pr = fin(‘precip’)
    pr.shape (데이터 정보 확인)
    
    ## 리눅스 상에서 ncview를 통해 대략적인 자료의 분포를 확인할 수 있음.
    
    prmax()  ## 강우강도의 최댓값 
    pr.min()	## 강우강도의 최솟값
    Pr.units	## 강우강도의 단위
    
    pr = pr*10*30	## 단위 변환
    Pr.units = ‘cm/month’
    
    Pr2000 = pr(times=(‘’
    Fin(filename (문자형), 
    Fin = cdms2.open(filename, ‘r’)
    Pr = fin(‘precip’, time=( ’1979-1-1’, ’2000-12-31’ ), latitude = ( , ), longitude = (,) )
    Fin(‘precip’) (time=( , ), latitude = (, ), longitude = (, ))
    Pr2000 = pr(time=(‘2000-1-1’, ‘2000-12-31’))을 가져오면
    Pr2000.shape (연 강수량이니깐)
    Pr2000_sum = MV2.sum(pr2000, axis=0)
    Pr2000_sum
    Pr2000_sum.info
    Pr2000_sum.max(), Pr2000_sum.min()
    
    pr2000_sum = np.sum(pr2000, axis=0)
    pr2000_sum.shape
    pr2000_sum.info
    pr2000_sum.max(), pr2000_sum.min()
    
    cdms2.setNetcdfShuffleFlag(0)
    cdms2.setNetcddeflateFlag(0)
    cdms2.setNetcdfDeflatelevelFlag(0)
    fout = cdms2.open(‘prec2000sum.nc’, ‘w’)
    fout.write(aaa, id=’precip’)
    fout.close()
    
    find . –name prec2000sum.nc –print
    
    mask_desert = MV2.masked_less(aaa, 25.0)
    mask_desert.max(), mask_desert.min()
    
    MV2.masked_equal(var, val)		## var = val
    MV2.masked_less(var, val)		## var < val
    MV2.masked_greater
               _less_equal
               _greater_equal
               _where(mask, var)	## mask와 var은 size가 동일해야 됨.
    mask = MV2.getmask(var_masked)	## mask은 1 또는 0으로 됨.
    
    Import regrid2
    Ingrid = regrid2.getGrid(aaa)
    Outgrid = aaa.grtGrid()
    Ftas = cdms2.open(./data/tas_ERA_40_2000.nc’, ‘r’)
    Tas = ftas(‘t2m’)
    Tas.shape
    Tas2 = tas.regrid(outgrid)
    Tas2.shape
    
    
    Tas = cdms2.createVariable(tas, axes=reec.get.AxisList())
    Fout.write(tas, id=’tas’)
    Fout.close()
    
    #====================================================
    # analysis_kma.py
    #====================================================
    ## str(1973) = ‘1973’
    ## qc은 적도에서 극으로 갈수록 면적이 감소하기 때문에 면적 평균을 수행해야 함.
    cdutil.averager
    
    ## t_KMA은 연평균 아노말리 
    ## 이번에는 아노말리 사이즈를 이용하여 42년에 걸쳐 관측소마다 결측값의 개수를 계산을 
    계산해야함.
    ## 즉 1행이라도 결측값이 있다면 41개 데이터만 추출됨.
    ## 축 정보를 포함시키기 위해서 cdms2.createVariale을 사용함.
    ## 선형회귀 및 통계적 유의수준은 NumPy, SciPy 등이 있음.
    ## s_kma와 i_kma	 그리고 Pt2K_kma은 각각 기온 관측소에 선형관계와 y 절편 그리고 유의수준을 의미함.
    ## 이 연구에서 전례없는 기후 시기에 대한 자연 변동성 크기를 보기 위해서 아노말리를 이용하여 표준편차 (추세선의 1 시그마)를 계산해야 함.
    
    #====================================================
    # csv2nc_kma_ann.py
    #====================================================
    ## 딕션너리로 자료를 읽은 후에 append를 이용하여 리스트에 순차적으로 추가함.
    ## x축, y축에서 start_year, end_year을 array 형태로 설정함.
    ## 교수님께서는 만능 프로그램을 코딩하여 사용하는 것을 좋아함.
    
    #====================================================
    # cmip5-regrid_clmon.py
    #====================================================
    해양은 깊이로 되어 있음.  
    cdo 옵션을 ngrids을 하는 옵션음.
    여러가지 내삽 방법이 있으나 generate_wgts
    
    실험 종류에 대해 do 루프를 구동함.  
    ## OUTPUT 디렉토리에 있는 파일명은 정규화된 패턴을 통해 리스트로 저장하는 과정임. 
    ## 파일의 유무를 판단하는 방법(not os.path.exists)
    ## 이 과정에서 외부 모듈 (cdo, gendis, ngrids: 해상도 조정)을 불러올 수 있음.
    
    ## cdo 패키지를 이용하여 100 km 해상도를 공간 일치하는 과정이나 50개 모형을 불러오다보니 에러가 발생할 수 있음.  따라서 자동화시킬 경우 if (modeli==’HadGEMS2-ES’) 조건문을 이용하여 해당 모형을 제외하여 구동함.
    
    ## 가중치의 유무에 따라 remap 방법이 다를 수 있으나 일반적으로 remapping를 이용함.  
    ## grid가있을 경우 2차 내삽 (bilinear) 등의 공간 내삽은 사용가능하나 에러가 발생됨.
    ## 주로 공간 내삽은 bilinear, 역거리 가중치법 (IDW) 주로 사용하고 mass, energy (SCRIP)은 평균뿐만 아니라 ---등 좋은 패키지임.
    ## regrid을 할 경우 평균은 가급적으로 바뀌지가 않으나 최대/최소이 좋은 방법임.
    ## cdo 패키지를 이용하여 33개 level로 내삽하는 방법임.  여기서 python은 쉘 프로그래밍 역할을 해줄 수 있음.
    ## 이 프로그램은 CMIP5을 처리할 수 있는 수십년 간의 노하우가 고스란히 녹아져 있으며 구동하하는데 18 시간 이상이 소요됨.
    
    #====================================================
    # ohc_ann1x1_basin.py
    #====================================================
    ## 해역별 (태평양만 등)로 나눠서 면적 평균함.

     

    cdms2를 이용하여 NetCDF 파일 읽고 쓰기 (2)
    ## 슬라이싱이 하는 방법임.
    pr = fin(‘precip’, time=(‘’, latitude =())
    pr = pr(lat --)
    asia = cdutil.region.domain (latitude=(20, 50),  \
    longitude=(100, 140) )
    ## 연구 영역을 조정하는 부분임.
    
    tas = 1X1
    pr = 2X2 
    ## 공간 해상도가 다를 경우 면적에 대한 가중치를 자동으로 처리해줌.
    
    cdms2.setAuto.Bounds(‘on’)은 동일한 경계면을 따라옴. 
    Cdutil.averater(var, ‘xyt’)
                    ‘x’ = zonal mean
                    ‘y’=meridiual mean
                    ‘xy’=areal mean
                    ‘t’=climateology
    weight = [‘equal’] 		## 1개 축에 대해서만 동등한 가중치를 부여함
    weights=[‘generate’, ‘equal’] 	## xy의 쓸 경우
    action = ‘average’ 		## default
           ‘sum’
    
    pr_ASIA_ts_by_np = np.average(pr_ASIA, axis=(1,2) )
    MV2.average(pr_ASIA, acis=(1,2) )
    pr_ASIA_clim = cdutl.ANNUALCYCLE.climatology(pr_ASIA)
    pr_ASIA_clim = cdutl.ANNUALCYCLE.climatology(pr_ASIA(time=(‘1981-1-1’, ‘2010-12-31’)))
    
    #====================================================
    # fig_korea_timeserise.py
    #====================================================
    fig =plt.figure()
    
    import cdms2
    import MV2
    import cdutil
    import numpy as np
    
    fig=plt.figure()
    p1 = fig.add.subplot (221)
    x1 =np.arrange(
    p1.plot(x1, pr_ASIA_ta)
    print len(x1), len(pr_ASIA_ta)
    
    Report : -5-5 (5S~5N), 210-270 영역에 대해 지표면 기온의 아노말리를 그리시오(https://uvcdat.llnl.gov/documentation/utilities/utilities-1.html).

     

    matplotlib 소개
    conda env list
    conda env remove –n acme_diag_env
    conda create –n uvcdat uvcdat
    -c conda-forge –c uvcdat
    -c doutriaux1
    
    #====================================================
    # fig_ano_trend.py
    #====================================================
    ## 1973-2015년에 대해 KMA와 NASA 관측소의 온도 및 아노말리 추세 분석할 수 있음.
    fig =plt.figure()		## 그림 파일 이름 설정함
    ## maplotlib의 경우 pyploalt만 이용하고 scipy.stats는 lineregress만 로드함.
    ## Ano_giss(S_KOREA)는 남한 영역에 대한 면적 평균을 하고 Ano_giss의 경우 전구 영역에 대한 면적 평균함.  그리고 taxis와 saxis는 각각 시간과 관측소 지점을 의미함.
    ## Python에서 줄 바꿈은 ;이고 이어 쓰기는 \임.
    ## KMA 또는 NASA 관측 자료는 missing value 또는 fill value로 정의되어 있기 때문에 다음과 같이 NAN 값으로 바꿔줌.
    ## nyrs_kma은 해당 관측소마다 자료의 개수를 나타내며 size_kma은 각 연도별 자료의 개수를 의미함.
    ## avg_ano_giss_glb은 시간에 대해 평균함. 
    ## subplot은 1 by 1에 첫번째를 의미하고 최대 가로 9개 및 세로 9개로 표출할 수 있음.
    ## xticks은 x축에 대한 틱 설정하는 부분로서 라벨 및 기울림 그리고 좌우 정렬 (ha)을 할 수 있음.
    ## np.poly1d은 1차 선형 회귀곡선을 이용할 수 있고 np.poly2d는 2차 다항식을 의미함.
    ## p1.plot(x값, y값, ‘k-‘ (검정색 실선), ‘k—‘ (검정색 파선), linewidth=3)를 통해 그림 2개를 그려줌. 
    ## subplots_adjust은 그림 간격을 조절할 수 있음.
    ## Python Plotting Beginners Guide.pdf 및 matplotlib gallery를 참조하면 바람 장미 등 많은 그래프를 그릴 수 있음.
    

     

    basemap 설치 및 basemap을 이용한 지도 그림 그리기
    • basemaptutorial.pdf 및 https://basemaptutorial.readthedocs.io/en/latest/first_map.html을 참조하여 실습함

    • PuTTy 설치 및 이용 방법 (설치 파일: putty-64bit-0.70-installer)

     

    ## Etopo는 해양 기상청에서 만든 고해상도 DEM 자료로서 기상학에서는 잘 사용하지 않음.  
    ## 지구 그리는 데 Mollweide projection (극지방이 조밀하여 보이지 않을 경우), Robinson, cylindrical, Equidistant (일반적으로 사용하는 도법). Lambert (WRF에서 쓰는 방법으로 등거리 간격이며 작은 영역 (동아시아)에 대한 유용한 도법), Orthographic (인공위성 도법), North Polar (극 중심 도법) 등이 있음. 
    llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat 	## ROI 영역 설정함.
    resolution 	## h에서 c로 갈수록 저해상도임.
    x, y = map(0, 0) 	## 위경도 값에 해당하는 부분임.
    map.plot(x, y, marker=’d’, color=’m’)		## 마젠타색으로 표시함.
    ## 래스터(raster) 데이터의 경우 .tiff을 그림의 값을 새로운 좌표계로 형성하는 방법임.
    ## linspace은 파이썬의 내장함수로서 10 개 간격으로 작성해줌.
    ## lons : -180~179, 1 (360 개) vector
    ## lats : -90~90, 1 (181 개) vector
    ## meshgrid은 2차원 격자를 형성해줌.
    	1	2	3	4	5
    1	o	o	o	o	o
    2	o	o	o	o	o
    3	o	o	o	o	o
    4	o	o	o	o	o
    5	o	o	o	o	o
    
    cs = map.contour(xx, yy, data, range(400, 1500, 100), cmap = plot.cm.cubehelix)
    plot.clable( ) 	## 유효숫자 설정 및 line 설정가능함.
    hex	## 육각 격자로 표시함.
    ## alpha는 투명도를 설명함.
    ## text는 텍스트를 삽입할 수 있음.
    ## 기본적인 폰트 크기 및 폰트를 설정 가능할 뿐만 아니라 구글맵도 연동하여 표출할 수 있음.
    ## draw.Drawconuntries은 나라의 국경 표시할 수 있음.
    ## -180W~180E를 그릴 경우 -180 = 180이 동일한 값이기 때문에 addcyclic이 필요함.
    ## colormap에서 vmin, vmax은 최대/최소 color에 해당하는 부분이고 colormesh은 컬러 맵을 그리는 방법임.
    gcpoints		## 지구는 한바퀴 도는 선을 그려주는 방법로서 구면좌표계에 대해 거리 측정함.
    is_land		## 육해상 마스킹을 해줌.
    maskoceans	## 해양에 대해서 마스크하는 방법임.
    nightshade	## 시간에 대해 그릴 수 있으며 투명도 설정 가능함.

     

    import matplotlib
    from mpl_toolkits.basemap import Basemap
    import numpy as np
    import matplotlib.pylab as plt
    
    # https://basemaptutorial.readthedocs.io/en/latest/first_map.html
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 12))
    
    # define font size
    plt.rc("font", size=22)
    
    map = Basemap()
    map.drawcoastlines()
    
    plt.show()
    plt.savefig('test.png')

     

     

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 12))
    
    map = Basemap(projection='ortho', 
                  lat_0=0, lon_0=140.7)
    
    #Fill the globe with a blue color 
    map.drawmapboundary(fill_color='aqua')
    #Fill the continents with the land color
    map.fillcontinents(color='coral',lake_color='aqua')
    
    map.drawcoastlines()
    
    plt.show()

     

     

    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 12))
    
    map = Basemap(projection='ortho', 
                  lat_0=0, lon_0=140.7)
    
    #Fill the globe with a blue color 
    map.drawmapboundary(fill_color='aqua')
    #Fill the continents with the land color
    map.fillcontinents(color='coral',lake_color='aqua')
    
    map.drawcoastlines()
    
    plt.show()
    
    
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    
    # define plot size in inches (width, 
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    from osgeo import gdal
    from numpy import linspace
    from numpy import meshgrid
    
    map = Basemap(projection='tmerc', 
                  lat_0=0, lon_0=3,
                  llcrnrlon=1.819757266426611, 
                  llcrnrlat=41.583851612359275, 
                  urcrnrlon=1.841589961763497, 
                  urcrnrlat=41.598674173123)
    
    ds = gdal.Open("../sample_files/dem.tiff")
    data = ds.ReadAsArray()
    
    x = linspace(0, map.urcrnrx, data.shape[1])
    y = linspace(0, map.urcrnry, data.shape[0])
    
    xx, yy = meshgrid(x, y)
    
    map.contourf(xx, yy, data)
    
    plt.show()height) & resolution(DPI)
    plt.figure(figsize=(12, 12))
    
    map = Basemap(projection='ortho', 
                  lat_0=0, lon_0=3, llcrnrlon=1.819757266426611, 
                  llcrnrlat=41.583851612359275, 
                  urcrnrlon=1.841589961763497, 
                  urcrnrlat=41.598674173123)
    
    #Fill the globe with a blue color 
    map.drawmapboundary(fill_color='aqua')
    #Fill the continents with the land color
    map.fillcontinents(color='coral',lake_color='aqua')
    
    map.drawcoastlines()
    
    plt.show()
    
    
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    from osgeo import gdal
    from numpy import linspace
    from numpy import meshgrid
    
    map = Basemap(projection='tmerc', 
                  lat_0=0, lon_0=3,
                  llcrnrlon=1.819757266426611, 
                  llcrnrlat=41.583851612359275, 
                  urcrnrlon=1.841589961763497, 
                  urcrnrlat=41.598674173123)
    
    ds = gdal.Open("../sample_files/dem.tiff")
    data = ds.ReadAsArray()
    
    x = linspace(0, map.urcrnrx, data.shape[1])
    y = linspace(0, map.urcrnry, data.shape[0])
    
    xx, yy = meshgrid(x, y)
    
    map.contourf(xx, yy, data)
    
    plt.show()

     

    sys, os, subprocess, glob 모듈 소개
    자동으로 프로그래밍할 경우 (shell 및 fortran 이용)
    그러나 파이썬의 경우 모두 사용할 수 있음.
    여러가지 일련의 과정을 파이썬 프로그래밍으로 이용할 수 있음.
    
    #====================================================
    # os
    #====================================================
    import os
    ## 리눅스 상에서는 mkdir –p class/math를 사용할 수 있으나 파이썬의 경우 os.path.join로 대체 가능함.
    import glob	## *를 사용할 수 있음.
    ## CMIP5의 50개 모형 자료를 이용할 경우 일일히 자료를 불러오기 어렵기 때문에 glob를 사용하여 자동으로 불러냄.  이 경우 자동화되기 때문에 실수가 최소한 줄여짐.
    ## append는 추가하거나 index는 인덱스 찾는 명령어임.
    ## add 및 copy는 각각 리스트 추가하거나 복사하는 명령어임.
    
    a = [1,2,3]
    b = a
    b.append(4)
    
    import os
    os.system(‘ls’)
    os.system(‘date’)
    from subprocess import call
    call('ls')
    
    if os.path.exist(*/dir2’):
       pass
    else:
       os.mkdir(‘./dir2)
    
    os.path.basenames 		## 파일 경로 중에서 파일명만 알려줌.
    
    #====================================================
    # sys
    #====================================================
    ## 화면에 입력한 값을 받아올 수 있음.
    sys.path 		## 경로 열기
    sys.exit		## 중간에 프로그램 구동 후 나감
    ## CMIP 50개 모형을 평균할 경우 프로그램 시스템 부하 발생. 이 경우 check_all를 이용하여 메모리 부하 및 섞이는 것을 방지해줌.
    ## check_call만을 사용할 것을 추천함.
    
    #====================================================
    # ohc_ann1x1_basin.py
    #====================================================
    ## basin (태평양, 대서양 등)별로 해양 깊이와 재현실험 (historical)을 통해 해양 열용량을 계산하는 프로그램. 
    ## 적도에서 극으로 갈수록 면적이 작아지기 때문에 grid_area를 이용하여 격자마다 면적 계산함.
    ## 모든 모형 결과를 불러올 경우 flist.sort()하여 알파벳 순으로 가져오므로 순차적으로 open를 통해 자료를 읽을 수 있음.
    ## CMIP5 파일명은 Var_HadGEM2-AO-rlilpl_*이기 때문에 split를 이용하여 파일명을 추출할 수 있음. 
    ## 코드 내에서 격자마다 육지 (50%) 및 해양 (50%)의 비율로 자료가 있을 경우만 사용함.
    ## easy_nc를 check_names를 이용하여 변환해줌.
    ## UV-CDAT는 window에 설치 가능하며 특히 기후 연구자에게 추천함.
    
    #====================================================
    # cmip5_regrid_clmon.py
    #====================================================
    ## 수온, 염분 (기상적으로 기온, 기압)를 이용하는 프로그램임.
    ## regrid2 말고 cdo 패키지를 사용해도 무방함.
    ## 맵핑할때 matplotlib와 basemap를 이용할 수 있음.
    
    #====================================================
    # 실습 코드
    #====================================================
    import os
    os.mkdir('mydir')
    
    foldername = os.path.join('mydir', 'python')
    os.makedirs(foldername)
    
    origfolder = os.getcwd() # get name of current folder
    os.chdir(foldername) # move ("change directory")
    ...
    os.chdir(origfolder) # move back
    
    !dir
    
    import glob
    filelist1 = glob.glob('*.py')
    print(filelist1)
    
    # os.getcwd()
    # os.curdir
    
    filelist1 = os.listdir('mydir')
    print(filelist1)
    dir(filelist1)
    
    a = [1,2,3]
    b = a
    b.append(4)
    print(b)
    print(a)
    
    import copy
    a = [1,2,3]
    b = copy.copy(a)
    b.append(4)
    print(b)
    print(a)
    
    alreverse()
    a.sort()
    
    os.path.split(os.getcwd())
    
    import sys
    dir(sys)
    
    sys.version
    
    print(sys.argv)
    
    # x = raw_input()
    def my_cal(x):
        print(x**2)
    my_cal(2)
    
    from subprocess import call
    subprocess.check_call(["ls", "-l"])
    
    import urllib
    from datetime import datetime, timedelta
    import numpy as np
    import os
    
    #====================================================
    # 기말고사 (시험 출제 범위)
    #====================================================
    Wikidocs.net 참조하여 자료 유형 (list, tuple, dictionary, string, set) 
    리스트로 arrey로 가능함.  튜플은 모형이나 값이 바뀌지 않음.
    a = list(1,2,3)
    b = tuple(a)
    a.append(4)
    b를 바꾸고 싶으면 b = list(b)
    필요할때마다 서로 호환 가능함.
    city = [‘강릉’, ‘서울’, ‘부산’]
    temp = [24, 27, 29]
    d = dict(zip(city, temp))
    d = {‘강릉’, 24, ‘서울’, 27, ‘부산’, ‘29’}
    
    pr : 1979-2000 (22)
    tas : 1982-2000 (25)
    공통되는 개수는 19개 이기 때문에 교집합을 구할 수 있음.
    A = [1,2,3]
    B = set([3,4,5])
    C = a*b (교집합을 하면 구할 수 있음)
    
    open
    Read()
    Readline()
    write(“ %% 10.1f”, x) 
    cdms2, cdutil (시험 제외)
    
    matlotlib, basemap (pdf)
    os, subprocess, sys (pdf)
    
    즉 시험범위는 다음과 같습니다.
    1. 자료유형(string, list, tuple,dictionary,set)  wikidocs참고
    2. 파일 읽고 쓰기
    3. matplotlib, basemap  pdf 설명서 참고
    4. os, subprocess, sys  pdf 설명서 참고
    
    제대로 실습하지 못했던, cdms2와 cdutil은 시험범위에 포함되지 않습니다.

     

     과제물

    강릉원주대 (Gangneung-Wonju National University, GWNU) 복사 관측소 (Radiation Observation Station)를 이용하여 자료 읽기 및 저장
    • 해당 과제를 하기 위한 컴파일 및 실행 코드는 파이썬 (Python)으로 작성되었고 과학 계산을 위한 라이브러리는 pandas, 기본 문법을 이용하였습니다.

    • 파이썬에서 자료 읽기 및 저장할 경우 라이브러리 또는 기본 문법을 사용할 수 있으며 이 과제물에서는 2 가지 방법을 모두 설명하겠습니다.

    • 소스코드는 그림과 같이 단계별로 자료 처리 과정을 수행하며 상세 설명은 다음과 같습니다.

    • 1 단계는 주 프로그램로부터 과학 계산에 필요한 라이브러리 읽기, CR1000_Table1.dat 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.

    • 2 단계는 해당 데이터를 CSV 형식으로 저장합니다.

     

    • 라이브러리 읽기

    # Library 
    import pandas as pd
    import numpy as np
    import sys
    import os

     

    [pandas 라이브러리]

    • 파일 설정 및 읽기

    # File read
    cr1000 = pd.read_table(os.getcwd()+'/CR1000_Table1.dat', sep=',', skiprows=[0, 2, 3])

     

     

    • 데이터 정보 확인

    ##  File info.
    print(cr1000.info())
    print(cr1000.head())
    print(cr1000.tail())
    
    # Gangneung-Wonju National University (GWNU) Radiation Observation Station (37.77 N, 128.86 E)
    # Variable: Air temperature(Vaisala Inc.), Pressure(Vaisala Inc.), Direct solar radiation by the Pyrheliometer(Kipp & Zonen Inc.)
    #           Wind speed(Vaisala Inc.), Wind direction(Vaisala Inc.), Sun_Duration_sec 
    # Resolution: 1 min. Avg

     

    • 변수 가져오기

    # 1) Variable extraction
    data = cr1000[ ['TIMESTAMP', 'AIRTEMP_Avg', 'Press_hpa_Avg', 'CHP1_Avg', 
                'NIP_Avg', 'Wind_Speed', 'Wind_Direction', 'Sun_Duration_sec'] ]
    
    # 2) Variable extraction
          # data = pd.concat([cr1000.TIMESTAMP, cr1000.AIRTEMP_Avg, cr1000.Press_hpa_Avg, cr1000.CHP1_Avg,
          #                   cr1000.NIP_Avg, cr1000.Wind_Speed, cr1000.Wind_Direction, cr1000.Sun_Duration_sec], 
          #                  axis=1)
    
          # cr1000.TIMESTAMP == cr1000['TIMESTAMP']
    

     

    • 파일 저장

    # File write
    data.to_csv(os.getcwd()+"/GWNU_Radiation_Observation_Station_2015-12-18.OUT", index=None, na_rep="NaN", sep=" ")

     

     

    [기본 문법]

    • 읽기/저장 파일 설정

    ###############################################################################  
    #                         Basic Grammar: File  read/write
    ###############################################################################  
    fopen = open(os.getcwd()+"/CR1000_Table1.dat", "r")
    fout = open(os.getcwd()+"/GWNU_Radiation2_Observation_Station_2015-12-18.OUT", "w")

     

     

    • 파일 출력

      • fopen.readline()를 통해 행마다 읽기 및 구분자 (,) 분할

      • 출력 변수에 대한 열 번호 선택

    for i in range(4):
       line = fopen.readline().split(",")
       if (i == 1) : 
          head = line
          fout.write(" ".join(head))
          # "TIMESTAMP" "RECORD" "AIRTEMP_Avg" "Press_hpa_Avg" "A_Avg" "B_Avg" "C_Avg" "CHP1_Avg" "NIP_Avg" "AWm_Avg" "BWm_Avg" "CWm_Avg"
          #      0         1          2               3           4       5       6         7         8         9        10        11
          # "DirWm_Avg" "NIPWn_Avg" "RH_Avg" "Wind_Speed" "Wind_Direction" "CSD3_Direct_wm2_Avg" "Sun_Duration_sec" "Sun_Duration_hr_day"
          #     12        13         14          15            16                 17                   18                   19head[0]
          
    lines = fopen.readlines()
    for i in lines:
        line = i.split(",")
        fout.write(line[0] + ' ' + line[2] + ' ' + line[3] + ' ' + line[7] + 
                   line[8] + ' ' + line[15] + ' ' + line[16] + ' ' + line[18] + "\n")

     

     

    • 파일 닫기

    fopen.close()
    fout.close()

     

    1904-2016년 연평균 지상 관측 자료 처리 및 가시화
    • 라이브러리 읽기

    # Library 
    import pandas as pd
    import numpy as np
    import sys
    import os
    import matplotlib.pyplot as plt
    import numpy as np
    from dplython import *

     

    • 파일 설정 및 읽기

    # File read
    data = pd.read_csv('1904-2016_Yearly_Mean_Groud_Obs.KMA', sep="\s+")

     

    • 데이터 정보 확인

    # File info.
    print(data.info())
    print(data.head())
    print(data.tail())
    
    
    # 시간: 1904-2016년 연평균 자료 (지상관측)
          
    # 변수: 지점,  년,  기온,  기압,  상대습도,  풍속
    #        id   year  temp   pre       rh       ws
    
    # 지점: 강릉,  광주,  대구,  대전,  부산,  서울,  전주,  제주,  청주,  춘천,  원주,  대관령
    #      105    156    143    133    159    108    146    184    131    101    114    100
    
    # 출처: 기상청  국가기후데이터센터 (http://sts.kma.go.kr/jsp/home/contents/main/main.do)
    
    # 지점마다 관측 기간이 다름
      # 대관령: 1972-2016
      # 춘천  : 1966-2016
      # 강릉  : 1912-2016
      # 서울  : 1908-2016
      # 원주  : 1972-2016          
      # 청주  : 1979-2016
      # 대구  : 1909-2016
      # 전주  : 1919-2016
      # 광주  : 1940-2016
      # 제주  : 1924-2016
      # 1979-2016년에 대해 분석을 수행함.

     

    • 데이터 프레임을 이용한 L1 전처리 및 가시화

      • 각 지점 (105, 108, 133, 143, 159)에 따른 가시화

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 6))
    
    # define font size
    plt.rc("font", size=18)
    
    # style
    plt.style.use('seaborn-darkgrid')
     
    # create a color palette
    palette = plt.get_cmap('Set2')
    
    num = 0
    for i in [105, 108, 133, 143, 159]:
        num += 1
        data_L2 = DplyFrame(data) >> sift(X.id == i)
        plt.plot(data_L2.year, data_L2.temp, color=palette(num), linewidth=2, label=i)
        plt.title("Time  series  of  yearly  mean  temperature  for  the  year  of  1979-2016")
    #     plt.legend(loc = "upper left", numpoints = 1)
        plt.legend(loc = "lower right", numpoints = 1)
        plt.xlabel("Time  [Year]")
        plt.ylabel(u"Air  Temperature  [\u00B0C]")
        plt.xlim(1980, 2015)
        plt.ylim(10, 16)
        plt.savefig("Yearly mean temperature.png")
    plt.show()

     

     

    지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기
    • 해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었고 과학 계산을 위한 라이브러리는 Numpy, pandas, matplotlib를 이용하였습니다.

    • 소스코드는 그림과 같이 단계별로 자료 처리 과정을 수행하며 상세 설명은 다음과 같습니다.

    • 1 단계는 주 프로그램 (csv2nc_kma_ann.py)로부터 아스키 형식의 입력 자료 경로를 설정하여 컴파일 및 실행을 하면 NetCDF 형식 (tas_1904-2016_ann.nc)으로 저장됩니다.  

    • 2 단계는 보조 프로그램 (time_series_ncfile.py)로부터 과학 계산에 필요한 라이브러리 선언, Yearly_Mean_Temperature_1904-2016.nc 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.  

    • 3 단계는 tas_qc 변수를 이용하여 시계열 그래프를 그려 이미지 파일 형식으로 저장합니다.

     

    • 라이브러리 읽기

    # Library 
    from netCDF4 import *
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.pylab as plt
    from netCDF4 import Dataset, num2date
    import pandas 
    import numpy as np

     

    • NetCDF 파일 읽기

    # File read
    nc = NetCDFFile("tas_1904-2016_ann.nc")
    print(nc)

     

     

    • 변수 가져오기

      • 시간 : time

      • 지점 : station

      • 원시 기온 : tas_raw

      • 품질검사 후 기온 : tas_qc

      • 위도 : xlat

      • 경도 : xlon

      • 고도 : xhgt

    time = nc.variables["time"][:]
    station = nc.variables["x"][:]
    tas_raw = nc.variables["tas_raw"][:]
    tas_qc = nc.variables["tas_qc"][:]
    xlat = nc.variables["xlat"]
    xlon = nc.variables["xlon"]
    xhgt = nc.variables["xhgt"]

     

    • 시계열 그래프 가시화 및 이미지 저장

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 6))
    
    # define font size
    plt.rc("font", size=18)
    
    # style
    plt.style.use('seaborn-darkgrid')
     
    # create a color palette
    palette = plt.get_cmap('Set2')
    
    
    num = 0
    station2 = np.array([105., 108., 133., 143., 159.])
    station2_name = np.array(["Gangneung", "Seoul", "Daejeon", "Jeonju", "Busan"])
    for i in range(0, 95):
        
        if station[i] == station2[num] :
            
            plt.plot(time[0:113]+1904, tas_raw[0:113,i], color=palette(num), linewidth=2, label=station2_name[num])
            plt.title("Time  series  of  Annually  Mean  Temperature  for  the  Year  of  1904-2016 \n")
        #     plt.legend(loc = "upper left",l numpoints = 1)
            plt.legend(loc = "lower right", numpoints = 1)
            plt.xlabel("Time  [Year]")
            plt.ylabel(u"Air  Temperature  [\u00B0C]")
            plt.xlim(1900, 2020)
            plt.ylim(9, 16)
            plt.savefig("Yearly mean temperature2.png")
            num = num + 1
    plt.show()

     

    그림. 1904-2016년 각 지상 관측소 (강릉, 서울, 대전, 제주, 부산)에 대한 연평균 온도 시계열.

     

    GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출 
    • 해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었으며 과학 계산을 위한 라이브러리는 Basemap, numpy, matplotlib, netCDF4를 이용하였습니다.

    • 소스 코드는 그림과 같이 단계별로 수행하며 상세 설명은 다음과 같습니다.

    • 1 단계는 주 프로그램 (ERA_tas_gpcp_prc_mask.py)로부터 ECMWF 및 GPCP의 입력 자료 경로를 설정하여 메모리상에 저장하고 마스킹을 위하여 두 자료를 공간 일치시켜 사막 외 영역을 제거하였습니다. 

      • 이 과정에서 사막 영역은 연평균 강수량이 250 mm/year 이하로 정의하고 Netcdf 형식으로 저장하였습니다 (ERA_tas_mask.nc).  

    • 2 단계는 보조 프로그램 (mapping_ncfile.py)로부터 과학 계산에 필요한 라이브러리 읽기, ERA_tas_mask.nc 파일을 읽고 해당 변수를 추출하여 메모리상에 저장합니다.

    • 3 단계는 위도 (lat), 경도 (lon), 기온 (val) 변수를 이용하여 영상 장면 표출을 하여 이미지 형식으로 저장하였습니다.  그러나 현재는 연평균 250 mm/year 이하인 육지 및 해상에 표출되기 때문에 추후 landsea 마스킹이 필요하다.

    • 그리고 사막 영역을 마스킹한 자료뿐만 아니라 ECMWF를 이용한 연평균 기온 자료와 GPCP를 이용한 강우강도 자료를 표출하였다.

     

    [GPCP 강우강도 자료를 이용하여 사막 영역 마스킹 후 ECMWF 기온 표출]

    • 라이브러리 읽기

    #=======================================================
    #	Library 
    #=======================================================
    import cdms2, cdutil, MV2
    import regrid2, vcs, os
    from mpl_toolkits.basemap import Basemap
    import numpy as np
    import matplotlib.pyplot as plt
    import netCDF4

     

    • NetCDF 파일 읽기

    #=======================================================
    #	Netcdf file read
    #=======================================================
    fn_temp = cdms2.open('tas_ERA40_2000.nc', 'r')
    fn_prc  = cdms2.open('gpcp.nc', 'r')

     

    • 해당 변수 (기온, 강우강도) 추출하여 연평균 수행 및 요약 통계량 계산

    temp = fn_temp('t2m', time = ('2000-1-1', '2000-12-31'))
    mean_temp = MV2.average(temp, axis=0)
    print(mean_temp.shape)
    print(mean_temp.max())
    print(mean_temp.min())
    
    prc  = fn_prc('precip', time = ('2000-1-1', '2000-12-31'))
    mean_prc = MV2.average(prc, axis=0)*365     # mm/day * 365 = mm/year
    print(mean_prc.shape)
    print(mean_prc.max())
    print(mean_prc.min())

     

    • 연평균 기온 및 강수량은 공간 일치시켜 마스킹 수행

    #=======================================================
    #	Agreement of space
    #=======================================================
    outgrid = mean_temp.getGrid()
    mask_prc = mean_prc.regrid(outgrid)

     

    • 연평균 강수강도가 250 mm/year 이하를 사막으로 정의

      • 여기서 사막 영역일 경우 mask는 1이고 그렇지 않을 경우 0으로 메모리 상에 저장

    #=======================================================
    #	Mask
    #=======================================================
    val = 250
    mask_loc = MV2.masked_less(mask_prc, val)
    mask     = MV2.getmask(mask_loc)

     

    • NetCDF 파일 출력

    #=======================================================
    #	Netcdf file
    #=======================================================
    value = 0
    cdms2.setNetcdfShuffleFlag(value) ## where value is either 0 or 1
    cdms2.setNetcdfDeflateFlag(value) ## where value is either 0 or 1
    cdms2.setNetcdfDeflateLevelFlag(value) ## where value is a integer between 0 and 9 included
    
    Fout = cdms2.open('ERA_tas_mask.nc', 'w')
    Fout.write(mean_temp*mask, id='t2m')
    
    #Fout = cdms2.open('ERA_tas.nc', 'w')
    #Fout.write(mean_temp, id='t2m')
    
    # Fout = cdms2.open('gpcp_prc.nc', 'w')
    # Fout.write(mean_prc, id='precip')
    Fout.close()

     

    • NetCDF 파일 읽기

    nc = Dataset("INPUT/ERA_tas_mask.nc", "r")
    print(nc)

     

     

    • 변수 가져오기 및 요약 통계량 계산

      • 위도 : lat

      • 경도 : lon

      • 연평균 기온 : t2m

    lat = nc.variables["latitude"][:]
    lon = nc.variables["longitude"][:]
    val = nc.variables["t2m"][:]
    
    print(lat.max(), lat.min())
    print(lon.max(), lon.min())
    print(val.max(), val.min())

     

    • 사막 영역에 대해 연평균 기온 표출 및 이미지 저장

      • 이 과정에서 연평균 250 mm/year 이하로 정의되어 육지 및 해상에서 표출되나 추후 육/해상 (Land/Sea) 마스킹이 필요

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 6))
    
    # define font size
    plt.rc("font", size=18)
    
    # Plot the field using Basemap.  Start with setting the map
    # projection using the limits of the lat/lon data itself:
    m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(), 
              urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
              resolution='c')
    
    # convert the lat/lon values to x/y projections.
    x, y = m(*np.meshgrid(lon,lat))
    
    # plot the field using the fast pcolormesh routine 
    # set the colormap to jet.
    m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
    m.colorbar(location='right', label="Air  Temperature  [K]")
    
    # Add a coastline and axis values.
    m.drawcoastlines(color='white')
    # m.drawlsmask(land_color='coral',ocean_color='aqua', lsmask=1)
    m.drawlsmask(ocean_color='white', lsmask=False)
    # m.drawcoastlines(color='white')
    # m.fillcontinents(color='white') # only land
    plt.clim(280, 310)
    m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
    m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
    
    # Add a colorbar and title, and then show the plot.
    plt.title('Mapping  of  Annually  Mean  2 meter  Temperature  using  ECMWF \n')
    plt.savefig("Mapping  of  Annually  Mean  2 meter  Temperature  using  ECMWF.png")
    plt.show()

     

     

    [GPCP 자료를 이용한 강우강도 표출]

    • GPCP NetCDF 파일 읽기

    # nc = NetCDFFile("INPUT/2017-11-15/gpcp_prc.nc")
    nc = Dataset("INPUT/2017-11-15/gpcp_prc.nc", "r")
    print(nc)

     

    • 변수 가져오기 및 요약 통계량 계산

    lat = nc.variables["lat"][:]
    lon = nc.variables["lon"][:]
    val = nc.variables["precip"]
    
    print(lat.max(), lat.min())
    print(lon.max(), lon.min())
    # print(val.max(), val.min())

     

    • GPCP의 연평균 강우강도 가시화 및 이미지 저장

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 6))
    
    # define font size
    plt.rc("font", size=18)
    
    # Plot the field using Basemap.  Start with setting the map
    # projection using the limits of the lat/lon data itself:
    # m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(), 
    m=Basemap(projection='cyl',lat_ts=0,llcrnrlon=lon.min(), 
              urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
              resolution='c')
    
    # convert the lat/lon values to x/y projections.
    x, y = m(*np.meshgrid(lon,lat))
    
    # plot the field using the fast pcolormesh routine 
    # set the colormap to jet.
    m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
    m.colorbar(location='right', label="Precipitation  Rate  [mm/year]")
    
    # Add a coastline and axis values.
    m.drawcoastlines(color='white')
    plt.clim(0, 3000)
    # m.fillcontinents()
    # m.drawmapboundary()
    # m.drawlsmask(land_color='coral',ocean_color='aqua')
    m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
    m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
    
    # Add a colorbar and title, and then show the plot.
    plt.title('Mapping  of  Annually  Mean  Precipitation  Rate  using  GPCP \n')
    plt.savefig("Mapping  of  Annually  Mean  Precipitation  Rate  using  GPCP.png")
    plt.show()

     

    그림. GPCP 자료를 이용한 강우강도 가시화.

     

    [ECMWF를 이용한 연평균 기온 표출]

    • ECMWF NetCDF 파일 읽기

    nc = NetCDFFile("INPUT/2017-11-15/ERA_tas.nc")
    print(nc)

     

    • 변수 가져오기 및 요약 통계량 계산

    lat = nc.variables["latitude"][:]
    lon = nc.variables["longitude"][:]
    val = nc.variables["t2m"]
    
    print(val)
    # print(lat.max(), lat.min())
    # print(lon.max(), lon.min())
    # print(val.max(), val.min())

     

    • ECMWF의 연평균 기온 표출 및 이미지 저장

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 6))
    
    # define font size
    plt.rc("font", size=18)
    
    # Plot the field using Basemap.  Start with setting the map
    # projection using the limits of the lat/lon data itself:
    m=Basemap(projection='mill',lat_ts=0,llcrnrlon=lon.min(), 
              urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(),
              resolution='c')
    
    # convert the lat/lon values to x/y projections.
    x, y = m(*np.meshgrid(lon,lat))
    
    # plot the field using the fast pcolormesh routine 
    # set the colormap to jet.
    m.pcolormesh(x,y,val,shading='flat',cmap=plt.cm.jet)
    m.colorbar(location='right', label="2 meter  Temperature  [K]")
    
    # Add a coastline and axis values.
    m.drawcoastlines(color='white')
    plt.clim(220, 310)
    # m.fillcontinents()
    # m.drawmapboundary()
    m.drawparallels(np.arange(-90.,120.,30.),labels=[1,0,0,0])
    m.drawmeridians(np.arange(-180.,180.,60.),labels=[0,0,0,1])
    
    # Add a colorbar and title, and then show the plot.
    plt.title('Mapping  of  Annually  Mean  2 meter  Temperature  using  ECMWF \n')
    plt.savefig("Mapping  of  Annually  Mean  2 meter  Temperature  using  ECMW.png")
    plt.show()

     

    그림. ECMWF 자료를 이용한 연평균 기온 가시화.

     

    히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석
    • 해당 과제를 하기 위한 컴파일 및 실행 코드는 Python으로 작성되었으며 과학 계산을 위한 라이브러리는 numpy, pandas, matplotlib, Basemap, scipy (conda 제공) 그리고 dplython (conda 미제공)를 이용하였습니다.  

    • 소스코드는 그림과 같이 단계별로 자료 처리 수행하여 산점도 및 장면 분포 (Mapping)을 가시화하였습니다.  

    • 즉 1 단계는 주 프로그램 (ITM_ report4.ipynb)로부터 과학 계산에 필요한 라이브러리 읽고 2016년 10월 01일에 대해 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES)를 시공간 일치시킨 파일 (Aqua_20161001.OUT)을 읽습니다.

    • 2 단계는 대기상단에서의 광대역 알베도 (TOA Albedo) 및 상향단파복사 (RSR), 지표면에서의 투과율 (Transmittance) 및 하향단파복사 (DSR)의 변수에 대해 전처리 과정을 거쳐 메모리 상에 저장합니다.

    • 3 단계는 대기상단에서의 상향단파복사 (RSR) 및 지표면에서의 하향단파복사 (DSR)을 이용하여 산점도와 장면 분포를 가시화하여 이미지 형식으로 저장합니다.

     

    • 라이브러리 읽기

    # Library
    import pandas as pd
    import numpy as np
    import sys 
    import os
    import matplotlib.pyplot as plt
    from dplython import *
        # (DplyFrame, X, diamonds, select, sift, sample_n,
        #     sample_frac, head, arrange, mutate, group_by, summarize, DelayFunction) 
    from scipy.stats import linregress
    from matplotlib import pyplot as plt
    from IPython.display import Image
    from mpl_toolkits.basemap import Basemap
    from matplotlib.colors import Normalize
    import matplotlib
    import matplotlib.cm as cm
    import seaborn as sns
    from scipy.stats import linregress
    from matplotlib import rcParams

     

    • 아스키 (ASCII) 파일 읽기

      • 2016년 10월 01일에 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES)와의 시/공간 일치된 파일 읽기

    col_name = ["lon", "lat", "sza", "vza", "ga", "ceres_albedo", "ceres_rsr", "ceres_trans", "ceres_dsr",
                                   "albedo", "rsr", "trans", "dsr", "ceres_landcover", "ceres_clear_fraction"]
    data = pd.read_csv('INPUT/2017-12-02/Aqua_20161001.OUT', sep='\s+', header=None, names=col_name)
    
    ## longitude, Latitude, Solar zenith angle, Viewing zenith angle, Glint angle, 
    ## CERES TOA albedo, CERES rsr,CERES transmittance, CERES DSR
    ## AHI TOA albedo, AHI rsr,AHI transmittance, AHI DSR
    ## Landcover, Clear fraction
    
    data.head()

     

     

    • 데이터 프레임를 이용한 L1 전처리

      • AHI와 CERES의 상향단파복사 (*_rsr), 하향단파복사 (*_dsr), 광대역 알베도 (*_albedo), 대기 투과율 (*_trans)의 물리적 관측 범위 설정

      • 태양 천정각 (sza) 및 위성 천정각 (vza)이 증가할수록 길어지는 광학경로로 인해 오차가 발생하기 때문에 80 이상을 제외

    data_L1 = (
        DplyFrame(data) 
        >> sift((0 <= X.ceres_rsr) & (X.ceres_rsr <= 1400))
        >> sift((0 <= X.ceres_albedo) & (X.ceres_albedo <= 1))
        >> sift((0 <= X.ceres_dsr) & (X.ceres_dsr <= 1400))
        >> sift((0 <= X.ceres_trans) & (X.ceres_trans <= 1))
        >> sift((0 <= X.rsr) & (X.rsr <= 1400))
        >> sift((0 <= X.albedo) & (X.albedo <= 1))
        >> sift((0 <= X.dsr) & (X.dsr <= 1400))
        >> sift((0 <= X.trans) & (X.trans <= 1))
        >> sift((0 <= X.sza) & (X.sza <= 80))
        >> sift((0 <= X.vza) & (X.vza <= 80))
    )
    
    data_L1.head()

     

     

    • 산점도 가시화 및 이미지 저장

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 10))
    
    # define font size
    plt.rc("font", size=22)
    # plt.rcParams["font.family"] = "Times New Roman"
    rcParams['font.family'] = 'sans-serif'
    # rcParams['font.family'] = 'New Century Schoolbook'
    
    # style
    plt.style.use('seaborn-darkgrid')
    
    # x, y setting
    X = data_L1.dsr
    Y = data_L1.ceres_dsr
    
    # Estimate the 2D histogram
    nbins = 250
    H, xedges, yedges = np.histogram2d(X, Y, bins=nbins)
     
    # H needs to be rotated and flipped
    H = np.rot90(H)
    H = np.flipud(H)
    # Mask zeros
    Hmasked = np.ma.masked_where(H==0,H) # Mask pixels with a value of zero
    
    plt.pcolormesh(xedges, yedges, Hmasked, cmap=cm.get_cmap('jet'), vmin=0, vmax=100)
    plt.title("Retrieval of Downward Shortwave Radiation (DSR) \n at the Surface using Himawari-8 / AHI data\n")
    plt.xlabel('Himawari-8 / AHI  DSR  $\mathregular{[Wm^{-2}]}$')
    plt.ylabel('Aqua / CERES  DSR  $\mathregular{[Wm^{-2}]}$')
    plt.xlim(0, 1400)
    plt.ylim(0, 1400)
    plt.grid()
    cbar = plt.colorbar()
    cbar.ax.set_ylabel('Count')
    
    ## Bias (relative Bias), RMSE (relative RMSE), R, slope, intercept, pvalue
    Bias = np.mean(X-Y)
    rBias = (Bias/np.mean(Y))*100.0
    RMSE = np.sqrt( np.mean((X-Y)**2) )
    rRMSE = (RMSE/np.mean(Y))*100.0
    slope = linregress(X, Y)[0]
    intercept = linregress(X, Y)[1]
    R = linregress(X, Y)[2]
    Pvalue = linregress(X, Y)[3]
    N = len(X)
    
    lmfit = (slope*X)+intercept
    plt.plot(X, lmfit, color='red', linewidth=2)
    plt.plot([0, 1400], [0, 1400], color='black', linewidth=2)
    
    print(Bias, rBias, RMSE, rRMSE)
    print(slope, intercept, R, Pvalue, N)
    
    plt.annotate('CERES = %.2f x (AHI) + %.2f' %(slope, intercept), xy=(20, 1350), color='red', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
    plt.annotate('R = %.2f  (p-value < %.2f)'   %(R, Pvalue), xy=(20, 1250), color='red', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
    plt.annotate('Bias = %.2f  (rBias = %.2f)' %(Bias, rBias), xy=(20, 1150), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
    plt.annotate('RMSE = %.2f  (rRMSE = %.2f)' %(RMSE, rRMSE), xy=(20, 1050), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
    plt.annotate('N = %d' %N, xy=(20, 950), color='black', fontweight='bold', xycoords='data', horizontalalignment='left', verticalalignment='center')
    plt.savefig("FIG/Scatterplot_Himawari-8_AHI_DSR.png")
    plt.show()

     

    그림. 2016년 10월 01일에 두 자료 (Himawari-8/AHI DSR, Aqua/CERES DSR)의 산점도 및 이미지 저장.

     

    • 장면 분석 가시화 및 이미지 저장

    %matplotlib inline
    
    # define plot size in inches (width, height) & resolution(DPI)
    plt.figure(figsize=(12, 10))
    
    # style
    plt.style.use('seaborn-darkgrid')
    
    # define font size
    plt.rc("font", size=22)
    # plt.rcParams["font.family"] = "Times New Roman"
    rcParams['font.family'] = 'sans-serif'
    # rcParams['font.family'] = 'New Century Schoolbook'
    
    m = Basemap(projection='ortho', lon_0=140.714793, lat_0=-0.007606, resolution='c')
    # c (crude) < l (low) < i (intermediate) < h (high) < f (full)
    # Source: http://seesaawiki.jp/met-python/d/Basemap
    
    x,y=m(data.lon.values, data.lat.values)
    val = data.dsr.values
    
    m.scatter(x, y, c=val, s=1.0, marker="s", zorder=1, vmin=0, vmax=1200, cmap=plt.cm.get_cmap('rainbow'), alpha=1.0) 
    plt.colorbar(label=r'Downward  Shortwave  Radiation  (DSR)  [Wm$^{-2}$]')
    
    m.drawcoastlines()
    m.drawcountries()
    m.drawmapboundary(fill_color='white')
    m.drawparallels(np.arange(-60.,61.,30.),labels=[1,0,0,0],dashes=[2,2])
    m.drawmeridians(np.arange(-160.,200.,30.),labels=[0,0,0,1],dashes=[2,2])
    plt.title('DSR using Himawari-8/AHI on the 1 October, 2016  \n')
    
    plt.annotate(u'60\N{DEGREE SIGN}S', xy=(m(170, -62.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'30\N{DEGREE SIGN}S', xy=(m(170, -32.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'30\N{DEGREE SIGN}N', xy=(m(170, +27.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'60\N{DEGREE SIGN}N', xy=(m(170, +57.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'80\N{DEGREE SIGN}E', xy=(m(80, -2.5))  , color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'110\N{DEGREE SIGN}E', xy=(m(110, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'110\N{DEGREE SIGN}E', xy=(m(110, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'140\N{DEGREE SIGN}E', xy=(m(140, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'170\N{DEGREE SIGN}E', xy=(m(170, -2.5)), color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.annotate(u'160\N{DEGREE SIGN}W', xy=(m(-160, -2.5)),color='magenta', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top')
    plt.savefig("FIG/Scane_analysis_Himawari-8_AHI_DSR.png")
    plt.show()

     

    그림. 2016년 10월 01일에 Himawari-8/AHI DSR의 장면 분석 가시화 및 이미지 저장.

     

    • 대기 상단에서의 상향단파복사 (RSR)

    그림.  2016년 10월 01일에 Himawari-8/AHI와 Aqua/CERES를 이용한 대기 상단에서의 상향단파복사와 두 자료의 백분율 오차 및 산점도.

     

    • 지표면에서의 하향단파복사 (DSR)

    그림.  2016년 10월 01일에 Himawari-8/AHI와 Aqua/CERES를 이용한 지표면에서의 하향단파복사와 두 자료의 백분율 오차 및 산점도.

     

     소스 코드

    • 추후에 링크 형식으로 추가 예정

     

     관련 자료

    • 지상 관측 자료 (아스키 파일)를 이용하여 NetCDF 변환한 후 시계열 그래프 그리기 그리고 GPCP 강우강도 자료를 이용하여 사막 영역을 마스킹하고 해당 영역에 대한 ECMWF 기온 표출

     

    • 히마와리위성 8호 (Himawari-8/AHI)와 극궤도 위성 (Aqua/CERES) 자료를 이용하여 지표면 및 대기상단에서의 단파복사 산출 및 비교 분석

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기