Skip to content
Optim-LabPublic

About

Sea Ice Open Index Forecasting with KOPRI.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

Sea Ice Open Index Forecasting with KOPRI

극지연구소의 개빙해역 변동 이해 과제를 위한 데이터 탐색 분석(Exploratory Data Analysis, EDA) 프로젝트입니다. 해빙 상태와 대기·해양 환경 자료를 읽는 데이터 로더 모듈과, 이를 활용한 분석 노트북으로 구성되어 있습니다.

자료 접근과 파일 구조 처리는 src/cdr_loaders/에서 담당합니다. 분석 기간 선택, 품질 필터, 파생변수 계산, 통계 분석과 시각화는 각 노트북에서 수행합니다.

1. 분석 자료와 데이터 로더

로더 모듈 자료 접근 방식 관련 노트북
nsidc.py ICESat-2 ATL04·ATL09 HDF5 프로파일 추출, 선택적 icepyx 조회·다운로드 01, 05
osisaf_sic.py OSI SAF OSI-450-a1 해빙농도 단일·복수 NetCDF 파일 02
era5.py ECMWF ERA5 대기·파랑·열역학 NetCDF·ZIP 파일, 선택적 CDS API 다운로드 03, 07, 08
esacci_sit.py ESA CCI CryoSat-2 L3C 해빙두께 v3.0 하위 폴더 검색 및 NetCDF 파일 04
osisaf_edge.py OSI SAF OSI-402-d 해빙 분류 OPeNDAP 또는 로컬 NetCDF 파일 06
osisaf_sid.py OSI SAF OSI-455 해빙 이동 OPeNDAP 또는 로컬 NetCDF 파일 09, 10

ICESat-2 자료는 궤도 관측자료, OSI SAF와 ESA CCI 자료는 해빙 관측 제품, ERA5는 기후 재분석 자료입니다. 파일 형식과 자료 구조가 서로 다르므로 제품별 로더를 사용합니다.

2. 프로젝트 구성

SeaIce/
├── README.md                     # 프로젝트 설명 및 구동 매뉴얼
├── pyproject.toml                # 패키지 구성과 의존성
├── requirements-lock.txt         # 검증 환경의 패키지 버전
├── .gitignore                    # Git 관리 제외 항목
├── src/cdr_loaders/
│   ├── __init__.py               
│   ├── _netcdf.py                # 공통 파일 검색·NetCDF 접근
│   ├── nsidc.py                  # ATL04·ATL09 로더
│   ├── osisaf_sic.py             # 해빙농도 로더
│   ├── era5.py                   # 대기·파랑·열역학 로더
│   ├── esacci_sit.py             # 해빙두께 로더
│   ├── osisaf_edge.py            # 해빙 분류 로더
│   └── osisaf_sid.py             # 해빙 이동 로더
├── data/
│   └── raw/                      # 사용자가 원자료를 준비하는 위치
└── EDA_notebooks/                # 로더 사용 예제 및 EDA 노트북

원자료는 저장소에 포함되어 있지 않습니다. 분석할 자료를 준비한 뒤 노트북의 입력 경로를 지정해야 합니다.

분석 노트북

노트북 주요 분석 내용
01.NSIDC_L2A.ipynb ATL04 후방산란 프로파일과 높이별 통계
02.OSISAF_SIC.ipynb 해빙농도의 공간 분포·계절 변화·기초 통계
03.ECMWF_ERA5.ipynb 기온·바람·해빙농도의 분포와 관계
04.ESACCI_SIT.ipynb 해빙두께의 월별·연도별 변화와 관측 범위
05.NSIDC_Arctic_Aerosol.ipynb ATL09 구름·에어로졸층의 시간·공간·수직 구조
06.OSISAF_SIE.ipynb 해빙 분류, 개빙 비율·지속성·상태 전이
07.ECMWF_ERA5_wave.ipynb 파랑·바람·해빙농도의 관계와 시차 분석
08.ECMWF_ERA5_heat.ipynb 표면 열 플럭스, MIZ 면적과 해빙 변화
09.OSISAF_SID.ipynb 해빙 이동·변형률·품질 정보와 극단 사건
10.OSISAF_SID_2.ipynb 해빙 이동의 장기·계절·공간 추세

01.NSIDC_L2A.ipynb의 대상 제품은 ATL04이며, 06.OSISAF_SIE.ipynb는 ice_edge 분류 변수를 분석합니다.

3. 실행 환경 설치

Python 3.12 이상을 사용합니다. 아래 명령은 저장소 최상위에서 실행합니다.

cd SeaIce
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[eda]"

Windows에서는 가상환경 활성화 명령을 다음과 같이 사용합니다.

.venv\Scripts\Activate.ps1

OPeNDAP 접근 또는 원자료 다운로드 기능이 필요하면 선택 패키지를 추가합니다.

python -m pip install -e ".[remote]"

pyproject.toml은 패키지 위치와 필요한 라이브러리를 정의합니다. 설치 후 노트북에서 다음과 같이 로더를 불러올 수 있습니다.

from cdr_loaders import load_osisaf_sic

requirements-lock.txt는 검증에 사용한 macOS·Python 3.12 환경의 패키지 버전 기록입니다. 원격 다운로드용 선택 패키지 전체를 포함하는 목록은 아니며, 다른 운영체제나 Python 버전에서는 호환 여부를 확인해야 합니다.

4. 데이터 준비와 노트북 실행

프로젝트 루트에서 Jupyter를 시작합니다.

jupyter lab

가상환경의 Python을 커널로 선택하고 필요한 노트북을 엽니다. 앞부분의 경로 설정 셀을 확인한 뒤 위에서 아래로 실행합니다.

기본 원자료 경로는 다음과 같습니다.

data/raw/
├── atl04/
├── atl09/
├── osisaf_sic/
├── era5_atmosphere/
├── esacci_sit/
├── osisaf_edge/
├── era5_wave/
├── era5_heat/
└── osisaf_sid/

각 노트북의 DATA_DIR는 입력 자료 위치, RESULT_DIR는 결과 저장 위치입니다. 다른 위치에 자료가 있다면 DATA_DIR를 해당 경로로 변경합니다.

기본 실행 예제

from pathlib import Path
from cdr_loaders import load_osisaf_sic

DATA_DIR = Path("data/raw/osisaf_sic")

ds = load_osisaf_sic(
    DATA_DIR / "ice_conc_nh_ease2-250_cdr-v3p1_202012.nc"
)

sic = ds["ice_conc"]
sic.mean("time").plot()

예제의 파일명은 필요한 자료 형태를 보여주기 위한 것으로, 실제 보유한 파일명에 맞춰 지정해야 합니다.

다운로드 설정

노트북의 기본 설정은 다음과 같습니다.

DOWNLOAD_DATA = False

보유한 자료로 분석할 때는 그대로 사용합니다. 원격 조회·다운로드를 실행할 경우 개인 인증을 준비하고 요청 기간·영역·변수를 확인한 뒤 True로 변경합니다.

OSI SAF 해빙 분류와 해빙 이동 노트북은 OPeNDAP 접근 예제를 제공합니다. 로컬 자료를 사용하려면 SOURCE를 파일 경로나 패턴으로 변경합니다.

SOURCE = str(DATA_DIR / "*.nc")
ds = load_osisaf_sid(SOURCE, chunks={"time": 30})

분석 기간, 품질 플래그, 임계값, 통계 방법과 그래프 설정은 각 노트북에서 지정합니다. 특정 날짜·월·연도를 비교하는 분석에는 해당 기간의 자료가 필요합니다.

5. 데이터 로더 사용법

5.1. NSIDC: ATL04

ATL04 로더는 HDF5의 profile_N 그룹에서 관측 위치, 시각, 지표면 정보와 NRB(Normalized Relative Backscatter) 배열을 읽습니다.

from cdr_loaders import load_atl04, atl04_to_dataframe

profile = load_atl04(
    "data/raw/atl04/example.h5",
    profile="profile_1",
)

df = atl04_to_dataframe(profile)
nrb_profile = profile["nrb_profile"].values
height_bins = profile["height_bin"].values

load_atl04()는 자료를 메모리에 읽은 xarray.Dataset을 반환하고 HDF5 파일을 닫습니다.

  • nrb_profile: 관측×높이 배열
  • height_bin: km 단위 높이 좌표
  • ds_va_bin_h: 원래 높이 bin 값
  • latitude, longitude: 관측 위치
  • delta_time, atlas_sdp_gps_epoch: 시각 계산 정보
  • surface_height, surface_conf: 지표면 높이와 신뢰도

atl04_to_dataframe()은 NRB 배열을 nrb_h_5.01과 같은 높이별 열로 변환합니다. NRB와 지표면 값의 품질 필터는 노트북에서 적용합니다.

표의 시각은 GPS epoch와 delta_time을 합산한 값이며 UTC 윤초 보정은 적용하지 않습니다. 지표면 높이와 높이 bin을 비교할 때는 단위를 확인해야 합니다.

5.2. NSIDC: ATL09

ATL09 로더는 profile_N/high_rate 그룹에서 대기층과 보정 후방산란 자료를 읽습니다.

from cdr_loaders import load_atl09_profile, load_atl09_layers

profile = load_atl09_profile(
    "data/raw/atl09/example.h5",
    profile="profile_1",
)

필요한 변수만 지정하면 큰 후방산란 배열을 읽지 않고 위치 정보만 가져올 수 있습니다.

location = load_atl09_profile(
    "data/raw/atl09/example.h5",
    fields=["latitude", "longitude"],
)

여러 granule의 대기층 배열을 표로 변환할 때는 다음 함수를 사용합니다.

layers = load_atl09_layers(
    "data/raw/atl09",
    profiles=["profile_1", "profile_2", "profile_3"],
    extent=[0, 70, 60, 88],  # 서, 남, 동, 북
    max_layers=10,
)

load_atl09_profile()은 xarray.Dataset, load_atl09_layers()는 한 행이 하나의 대기층 관측인 pandas.DataFrame을 반환합니다.

로더는 layer_top과 layer_bot의 채움값을 NaN으로 해석합니다. 층별 표에는 상·하단 고도가 유효하고 top > bot인 층을 포함합니다.

출력 열 layer_top_m, layer_bot_m, thickness_m은 m 단위입니다. km 변환과 고도·두께·층 유형에 대한 품질 필터는 05번 노트북에서 수행합니다.

공간 선택 후의 obs_idx는 선택된 영역 배열 안의 순서입니다. HDF5 전체 관측 배열의 인덱스로 사용하지 않습니다.

5.3. OSI SAF: 해빙농도(SIC)

단일 파일 또는 여러 월파일을 읽을 수 있습니다.

from cdr_loaders import load_osisaf_sic

one_month = load_osisaf_sic(
    "data/raw/osisaf_sic/example.nc"
)

all_months = load_osisaf_sic(
    "data/raw/osisaf_sic/ice_conc*2020*.nc",
    chunks={"time": 1},
)

복수 파일은 좌표 기준으로 결합합니다. 로더는 ice_conc 변수의 존재를 확인하고 농도 단위, 시간 경계, 품질 플래그와 투영 정보를 유지합니다.

농도 임계값, 결측값 처리와 통계 계산은 노트북에서 적용합니다.

5.4. ESA CCI: 해빙두께(SIT)

연도별 하위 폴더에서 제품 파일을 검색할 수 있습니다.

from cdr_loaders import find_esacci_sit_files, load_esacci_sit

files = find_esacci_sit_files("data/raw/esacci_sit")

with load_esacci_sit(files[0]) as ds:
    sit = ds["sea_ice_thickness"].isel(time=0).values

검색 패턴은 ESACCI-SEAICE-L3C-SITHICK*.nc입니다. 로더는 파일 하나, 디렉터리 또는 파일 목록을 입력으로 받으며 sea_ice_thickness 변수를 확인합니다.

04번 노트북은 각 파일에서 배열을 읽어 월별 자료 목록인 records를 구성합니다. 유효 두께 조건, 관측 범위와 월별·연도별 통계는 노트북에서 계산합니다.

5.5. OSI SAF: 해빙 분류와 해빙 이동

OPeNDAP 또는 로컬 NetCDF를 사용할 수 있습니다.

from cdr_loaders import load_osisaf_edge, load_osisaf_sid

edge = load_osisaf_edge()
sid = load_osisaf_sid(chunks={"time": 30})

sid_local = load_osisaf_sid(
    "data/raw/osisaf_sid/*.nc"
)

원격 접근은 netcdf4 엔진을 사용하며, 접근 오류가 발생하면 경고와 함께 pydap으로 재시도합니다.

load_osisaf_edge()는 ice_edge 분류값과 관련 메타데이터를 유지합니다.

load_osisaf_sid()는 dX, dY, 관측시간과 품질 정보를 유지합니다. 위치 변수인 lat, lon 등을 보조좌표로 등록하여 일부 변수를 선택한 뒤에도 위치 정보를 사용할 수 있도록 합니다.

dX, dY는 변위 자료입니다. 관측시간에 따른 속도 환산과 공간 미분·변형률 계산은 노트북에서 수행합니다.

반환된 NetCDF 자료는 사용이 끝난 뒤 닫습니다.

edge.close()
sid.close()
sid_local.close()

5.6. ERA5: 대기·파랑·열역학

일반 NetCDF 자료

from cdr_loaders import load_era5

ds = load_era5(
    "data/raw/era5_atmosphere/era5_arctic_monthly_2025.nc"
)

load_era5()는 변수명, 단위와 time 또는 valid_time 좌표를 유지합니다. 단일 파일, 복수 파일 패턴과 파일 목록을 사용할 수 있습니다.

파랑 분석 입력 자료

from cdr_loaders import load_era5_wave_inputs

inputs = load_era5_wave_inputs("data/raw/era5_wave")

ds_wave = inputs["wave"]
ds_wave_direction = inputs["wave_direction"]
ds_wind = inputs["wind"]
ds_sic = inputs["sic"]

기본 파일 구조는 다음과 같습니다.

era5_wave/
├── ERA5_wave/era5_wave_*.nc
├── ERA5_wind_direction/era5_wind_direction_1940_2026.nc
├── ERA5_wind/era5_wind_*.nc
└── ERA5_sic/era5_sic_*.nc

네 입력은 별개의 Dataset으로 반환합니다. 바람·농도 자료의 격자 보간과 파랑 자료와의 병합은 07번 노트북에서 수행합니다.

파일 구조가 다르면 각 자료를 load_era5()로 직접 읽을 수 있습니다. 분석이 끝난 뒤 각 입력 Dataset을 닫습니다.

for dataset in inputs.values():
    dataset.close()

열역학 월자료와 ZIP

from cdr_loaders import load_era5_monthly

loaded_ds = load_era5_monthly(
    "data/raw/era5_heat/era5_arctic_thermodynamics_2020_2025.nc"
)

ds = loaded_ds

load_era5_monthly()는 일반 NetCDF와 ZIP을 처리하며, ZIP이 .nc 확장자로 저장된 경우도 인식합니다.

로드 과정은 다음과 같습니다.

  1. ZIP 내부 NetCDF 파일을 임시 폴더에 해제합니다.
  2. time 좌표를 valid_time으로 통일합니다.
  3. expver가 있으면 결측이 아닌 값을 순서대로 결합합니다.
  4. 스칼라 number 보조좌표를 정리합니다.
  5. 시각을 월초로 정규화하고 중복 월은 첫 값을 유지합니다.
  6. 변수별 파일의 공통 월을 선택하여 병합합니다.

이 함수의 복수 파일 입력은 같은 기간을 포함하는 변수별 파일을 대상으로 합니다. 동일 변수의 자료를 연도별 파일로 나눈 경우에는 일반 load_era5()로 결합하거나 입력 구성을 조정해야 합니다.

변수명 변경, 플럭스 단위 검사, 순 열 플럭스와 다음 달 해빙농도 변화 등의 계산은 08번 노트북에서 수행합니다.

ZIP의 임시 파일은 로드 객체를 닫을 때 정리됩니다. 전체 분석이 끝난 뒤 다음 명령을 실행합니다.

loaded_ds.close()

환경의 패키지 버전은 requirements-lock.txt에서 확인할 수 있습니다.

About

Sea Ice Open Index Forecasting with KOPRI.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages