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))