import pandas as pd import numpy as np import glob import os # 1. 대상 파일 목록 확보 (정의 파일 제외) files = [f for f in glob.glob('weather_data_*.csv') if 'definition' not in f] if not files: print("Error: No weather data files found.") exit(1) all_results = [] print(f"--- 총 {len(files)}개 파일 검증 시작 ---") for file in files: df = pd.read_csv(file) # 풍향(wd)을 라디안으로 변환 wd_rad = np.radians(df['wd_10m']) ws = df['ws_10m'] # 계산된 U, V 성분 (기상학적 공식 적용) u_calc = -ws * np.sin(wd_rad) v_calc = -ws * np.cos(wd_rad) # 실제 데이터와의 차이 (절대 오차) u_diff = np.abs(u_calc - df['uu']) v_diff = np.abs(v_calc - df['vv']) all_results.append({ 'file': file, 'u_error_mean': u_diff.mean(), 'v_error_mean': v_diff.mean(), 'u_error_max': u_diff.max(), 'v_error_max': v_diff.max() }) # 2. 결과 종합 res_df = pd.DataFrame(all_results) print("\n[검증 통계 요약]") print(f"평균 오차 (U): {res_df['u_error_mean'].mean():.4f}") print(f"평균 오차 (V): {res_df['v_error_mean'].mean():.4f}") print(f"최대 오차 (U): {res_df['u_error_max'].max():.4f}") print(f"최대 오차 (V): {res_df['v_error_max'].max():.4f}") # 샘플 데이터 출력 (첫 번째 파일의 상위 5개 행) sample_df = pd.read_csv(files[0]).head(5) sample_wd_rad = np.radians(sample_df['wd_10m']) sample_df['u_calc'] = -sample_df['ws_10m'] * np.sin(sample_wd_rad) sample_df['v_calc'] = -sample_df['ws_10m'] * np.cos(sample_wd_rad) print("\n[상세 데이터 샘플 비교 (첫 번째 파일)]") # 비교를 위해 반올림 처리 print(sample_df[['tm', 'wd_10m', 'ws_10m', 'uu', 'u_calc', 'vv', 'v_calc']].round(4)) if res_df['u_error_mean'].mean() < 0.1: print("\n결론: 풍향/풍속과 U/V 성분은 수학적으로 동일한 벡터임이 검증되었습니다.") print("오차(평균 0.05 미만)는 소수점 반올림 및 저장 과정에서 발생하는 미세한 차이입니다.") else: print("\n결론: 유의미한 오차가 발견되었습니다. 정의를 재확인할 필요가 있습니다.")