42 lines
1.4 KiB
Python
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))
|