The JOISS jurisdiction marine information joint utilization system is a repository specializing in marine research data.
| |

Python

Python

· Python에서 JOISS 데이터 다루기  TOP

JOISS에서 다운로드 받은 파일을 아래 코드를 통해 Python에서 바로 불러올 수 있습니다.
파일내 주석 처리된 메타정보의 경우 자동으로 필터링 되므로 다운받으신 자료 그대로 사용하시기 바랍니다.
CTD 데이터 다운로드

#필요한 라이브러리 소환
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
import seaborn as sb
import scipy.stats as st
import cartopy.crs as crs
import cartopy.feature as cf

#첫26라인을 스킵
dat = pd.read_csv('c:/temp/CTD.csv', skiprows=26, encoding='euc-kr')
print(dat)
print(list(dat)) #칼럼명을 보여줌
#원하는 칼럼만으로 부분집합 구함
sub = dat[['station','date_time','longitude','latitude','수심_m','염분_psu','수온']]
sub = sub.rename(columns={'station':'지점', 'date_time':'일시', 'longitude':'경도', 'latitude':'위도', '수심_m':'수심', '염분_psu':'염분'}, inplace=False)
print(sub)
print(list(sub))
print(sub.describe()) #기초통계량

#히스토그램(카운트)
plt.hist(sub['염분'], color='blue', alpha=0.7, edgecolor='gray')
plt.show() #show 후에 창을 닫아야 다음 라인이 실행됨

#히스토그램(비율,곡선)
sb.histplot(sub['수온'], color='purple', kde=True, stat='density', linewidth=1)
plt.xlabel('Temperature (°C)')
plt.title('Histogram with density curve')
plt.show()

#한글폰트 설정
font = font_manager.FontProperties(fname='C:/Windows/Fonts/malgun.ttf').get_name()
rc('font', family=font)

#Q-Q plot
st.probplot(sub['염분'], plot=plt)
#유니코드 마이너스 대신 일반 마이너스 사용
plt.rc('axes', unicode_minus=False)
plt.title('염분 Q-Q Plot')
plt.show()

st.probplot(sub['수온'], plot=plt)
plt.rc('axes', unicode_minus=False)
plt.title('수온 Q-Q Plot')
plt.show()

#지점별 평균 수온
grp_tmp = sub.groupby('지점').mean()['수온']
grp_lat = sub.groupby('지점').mean()['위도']
grp_lon = sub.groupby('지점').mean()['경도']
plt.figure(figsize=(8,6))
ax = plt.subplot(111, projection=crs.PlateCarree())
ax.add_feature(cf.COASTLINE)
ax.set_extent([123.5, 132.5, 33, 39])
ax.scatter(grp_lon, grp_lat, c=grp_tmp, cmap='rainbow')
gl = ax.gridlines(draw_labels=True)
gl.bottom_labels=False
gl.right_labels=False
plt.show()

#지점별 계절별 평균 수온
sub['일시'] = pd.to_datetime(sub['일시'])
sub['월'] = sub['일시'].dt.month
sub_sp = sub[(sub['월']==3) | (sub['월']==4) | (sub['월']==5)]
sub_su = sub[(sub['월']==6) | (sub['월']==7) | (sub['월']==8)]
sub_fa = sub[(sub['월']==9) | (sub['월']==10) | (sub['월']==11)]
sub_wi = sub[(sub['월']==12) | (sub['월']==1) | (sub['월']==2)]
plt.figure(figsize=(8,6))
#봄
grp_tmp = sub_sp.groupby('지점').mean()['수온']
grp_lat = sub_sp.groupby('지점').mean()['위도']
grp_lon = sub_sp.groupby('지점').mean()['경도']
ax_sp = plt.subplot(221, projection=crs.PlateCarree()) #row col seq
ax_sp.add_feature(cf.COASTLINE)
ax_sp.set_extent([123.5, 132.5, 33, 39])
ax_sp.scatter(grp_lon, grp_lat, c=grp_tmp, cmap='rainbow')
#가을
grp_tmp = sub_fa.groupby('지점').mean()['수온']
grp_lat = sub_fa.groupby('지점').mean()['위도']
grp_lon = sub_fa.groupby('지점').mean()['경도']
ax_fa = plt.subplot(223, projection=crs.PlateCarree()) #row col seq
ax_fa.add_feature(cf.COASTLINE)
ax_fa.set_extent([123.5, 132.5, 33, 39])
ax_fa.scatter(grp_lon, grp_lat, c=grp_tmp, cmap='rainbow')
#겨울
grp_tmp = sub_wi.groupby('지점').mean()['수온']
grp_lat = sub_wi.groupby('지점').mean()['위도']
grp_lon = sub_wi.groupby('지점').mean()['경도']
ax_wi = plt.subplot(224, projection=crs.PlateCarree()) #row col seq
ax_wi.add_feature(cf.COASTLINE)
ax_wi.set_extent([123.5, 132.5, 33, 39])
ax_wi.scatter(grp_lon, grp_lat, c=grp_tmp, cmap='rainbow')
plt.show()

#시계열
sub_pnt = sub[sub['지점']=='es_ES04']
num = len(sub_pnt) #자료갯수
t = np.arange(0, num)
s1 = np.asfarray(sub_pnt['수온']) #float 배열로
s2 = np.asfarray(sub_pnt['염분'])
#figure 생성(2x1의 ax로 구성)
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, s1, color='blue', linewidth=1)
ax[0].set_xlabel('Time')
ax[0].set_ylabel('수온')
ax[0].grid(True) #격자형 보조선
ax[1].plot(t, s2, color='orange', linewidth=1)
ax[1].set_xlabel('Time')
ax[1].set_ylabel('염분')
ax[1].grid(True) #격자형 보조선
fig.tight_layout() #꽉차게 공간활용
plt.show()

#상관분석
cc = sub_pnt.corr() #상관계수
cc = np.round(cc, 3) #소수점이하 3자리 남김
ax = sb.heatmap(cc, cmap='coolwarm', linewidths=0.1, annot=True, fmt='.3f')
ax.xaxis.tick_top() #X틱을 위로 보냄
plt.title('es_ES04 지점', pad=10) #제목과 ax 간격을 10포인트 띄움
plt.show()

 TOP