javaboiii의 python

Python - 북극 해빙 면적 그래프

javaboiii 2024. 12. 6. 12:15

PYTHON

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np  # numpy를 임포트하여 평균 계산

# 파일 경로
path = '경로' # 파일위치 경로
file_name = 'ice size count.csv' # CSV 파일 이름
# 데이터 출처
# 해빙 면적 : https://oceanclimate.kr/seaice_area/?start=&end=&area=nh&var=all&month=all
file_path = path + file_name # 파일 경로

# CSV 파일 읽기
df = pd.read_csv(file_path, encoding='cp949')  # pd.read_csv == pandas의 함수로 CSV 파일을 읽어줌
                                    # cp949는 한글로 읽어들이기 위함

# 날짜 컬럼을 datetime 형식으로 변환
df['날짜'] = pd.to_datetime(df['날짜'].str.replace('년', '-').str.replace('월', '').str.replace('?', '').str.replace(' ', ''), errors='coerce')
# df['날짜'] 컬럼을ㄹ datetime 형식으로 변환
# str.replace == 문자열 내에 특정 문자를 다른 문자로 변환 
# pd.to_datetime == 문자열을 datetime 객체로 변환
# errors='coere'는 날짜 문자열을 datetime 형식으로 반환할 수 없을 때 해당 값을 Not a Time으로 설정 함

# 연도와 월 추출
# dt는 pandas의 datetime 객체에서 제공하는 속성이라 함
df['연도'] = df['날짜'].dt.year # 날짜 컬럼에서 year(연도)를 추출함
df['월'] = df['날짜'].dt.month # 날짜 컬럼에서 month(월)을 추출함 

# 연도별 평균값을 저장할 리스트
years = []  # 각 연도 리스트 초기화 
ice_size_avg = []  # 각 연도의 평균 해빙면적 리스트 초기화 

# 연도와 월을 결합하여 "연도-월" 형식으로 데이터를 필터링
for year in range(1981, 2024):  # 1981년부터 2023년까지 / range라는 파이썬 내장함수를 사용 (범위 지정)
    # 해당 연도와 1, 2, 3, 10, 11, 12월의 데이터만 추출
    filtered_data = df[(df['연도'] == year) & (df['월'].isin([1, 2, 3, 10, 11, 12]))]
                        # 위에서 추출한 연도와 반복문을 돌려서 나온 연도가 일치하면 true
                        # isin 메서를 사용하여 해당월이 추출한 df['월']에 포함된다면 true
    
    # 해당 연도의 해빙면적 평균 계산
    if len(filtered_data) > 0:  # 데이터가 있을 경우만 평균 계산 / len은 length
        avg_ice_size = filtered_data['북극 해빙면적 평균(10^6km)'].mean()
                            # mean() 메서드는 모든 값에 대해 평균을 구해줌
                            # filtered_data에 필터링된 데이터와 같은 행(row)에 있는 '북극 해빙면적 평균' 컬럼 값을 가지고 옴
        
        # 연도와 평균 해빙면적을 리스트에 추가
        years.append(year) # 반복문 돌려서 나온 year를 years에 저장
        ice_size_avg.append(avg_ice_size) # year와 일치하는 북해평 행 값을 ice_size_avg에 저장
        
        # 디버깅: 각 연도별 평균 출력
        print(f"Year: {year}, Average Ice Size: {avg_ice_size:.2f} (10^6 km²)")
        # f 는 f-String으로 { }안에 값을 바로 가져와서 사용할 수있음 / JS el표현식과 비슷한 느낌

# 데이터가 제대로 담겼는지 확인 (로그 출력)
print("연도별 평균 해빙면적:")
for i in range(len(years)): # years의 길이 만큼 range를 지정하여 반복문 수행
    print(f"Year: {years[i]}, Average Ice Size: {ice_size_avg[i]:.2f}")
    # years의 i번째 연도를 가지고오고 해빙면적 평균의 i번째 값을 가지고 오고 :.2f는 소수점 두자리 까지 반올림하여 출력

# 그래프 그리기
plt.figure(figsize=(16, 8)) # 그래프의 사이즈를 지정함 / figsize는 가로 세로의 크기 지정

# 연도별 해빙면적 평균 데이터 선 그래프
plt.plot(
    years, # x축 데이터 years
    ice_size_avg, # y축 데이터 해빙면적 평균
    color='tab:red', # 그래프 색은 red
    label='Ice Size Avg (10^6 km²)', # 그래프의 범례에 나타낼 텍스트
    linewidth=2 # 선의 두께 지정
)

# 각 데이터 포인트에 점 찍기
plt.scatter( # 각 그래프 데이터에 포인트 찍기
    years, # x축 데이터 years
    ice_size_avg, # y축 데이터 해빙면적 평균
    color='tab:red',  # 점 색상은 red
    zorder=5,  # 선 위에 점을 배치 / 우선 순위 배치 숫자가 크면 앞으로 옴
    label='Data Points' # 범례에 나타낼 텍스트 
)

# 그래프 제목 및 축 설정
plt.title('Ice Size Average (1981~2023 Winter)', fontsize=16) # 그래프 title 지정 / 글자 크기는 16
plt.xlabel('Year', fontsize=12) # x축 이름 지정 / 글자 크기는 12
plt.ylabel('Ice Size Avg (10^6 km²)', fontsize=12) # y축 이름 지정 / 글자 크기는 12

# x축 눈금 간격 설정 (연도 간격을 쉽게 보기 위해)
plt.xticks(years, fontsize=10, rotation=45) # x 축에 표시할 눈금 값 지정 / 글자 크기 10 / rotation == 기울기 45도
plt.grid(axis='y', linestyle='--', alpha=0.7) # y 축에만 그릴 그리드 지정/ linestyle == 선 모양 지정 '--' / alpha == 투명
        # axis에 'both'지정하면 x y 둘 다 그리드 표시

# 범례 추가
plt.legend(fontsize=12) # 그래프가 어떤 값인지 보여줌 / 글자 크기 12

# 그래프 레이아웃 조정 및 출력
plt.tight_layout() # 그래프의 모든 요소 레이아웃 최적화 / 공간 및 크기 조정

plt.show() # 그래프 출력하기

 

해빙 면적 감소하는 것을 볼 수 있음

'javaboiii의 python' 카테고리의 다른 글

Python - AOI와 서울 기온 그래프  (0) 2024.12.05
Python - 그래프  (0) 2024.12.03