kma-data-api/analyze_ws_error.py

42 lines
1.4 KiB
Python

import pandas as pd
import numpy as np
import glob
# 1. 대상 파일 목록
files = [f for f in glob.glob('weather_data_*.csv') if 'definition' not in f]
all_ws_results = []
for file in files:
df = pd.read_csv(file)
# 성분 기반 풍속 계산
ws_calc = np.sqrt(df['uu']**2 + df['vv']**2)
ws_recorded = df['ws_10m']
# 절대 오차 및 상대 오차
abs_error = np.abs(ws_calc - ws_recorded)
# 풍속이 0인 경우 제외하고 상대 오차 계산
rel_error = abs_error / ws_recorded.replace(0, np.nan)
df['ws_calc'] = ws_calc
df['ws_abs_err'] = abs_error
df['ws_rel_err'] = rel_error
all_ws_results.append(df[['ws_10m', 'ws_calc', 'ws_abs_err', 'ws_rel_err']])
# 2. 통계 종합
total_ws_df = pd.concat(all_ws_results)
print("[성분(U,V) 기반 풍속 역산 검증 결과]")
print("-" * 45)
print(f"1. 풍속 절대 오차 평균: {total_ws_df['ws_abs_err'].mean():.4f} m/s")
print(f" 풍속 절대 오차 최대: {total_ws_df['ws_abs_err'].max():.4f} m/s")
print("-" * 45)
print(f"2. 풍속 상대 오차 평균: {total_ws_df['ws_rel_err'].mean() * 100:.2f}%")
print(f" 풍속 상대 오차 최대: {total_ws_df['ws_rel_err'].max() * 100:.2f}%")
print("-" * 45)
# 오차가 큰 사례 확인
print("\n[풍속 오차 발생 샘플 상위 5개]")
print(total_ws_df.sort_values('ws_rel_err', ascending=False).head(5))