submarine_forecast / test_cleaned_data.py
kawaiipeace's picture
NEW: Major change and analyze the data to forecast and summary
6d2f083
Raw
History Blame
4.63 kB
#!/usr/bin/env python3
"""
Test pipeline ด้วย data ที่ filter outliers แล้ว
"""
import sys
import os
# Set UTF-8 encoding
if sys.platform == 'win32':
os.environ['PYTHONIOENCODING'] = 'utf-8'
sys.stdout.reconfigure(encoding='utf-8')
import pandas as pd
from openpyxl import load_workbook
from utils.preprocessing import preprocess_load_data, preprocess_temperature_data, preprocess_measurement_data
from utils.merge_data import aggregate_daily_max, merge_load_temp, merge_with_measurements
from utils.excel_loader import load_submarine_forecast_data
try:
print("=" * 60)
print("🔧 Loading submarine_forecast.xlsx...")
print("=" * 60)
# Load Excel
xls_file = './dataset/submarine_forecast.xlsx'
data = load_submarine_forecast_data(xls_file)
print(f"✅ Loaded 4 sheets: {list(data.keys())}")
print()
# ========== PREPROCESS ==========
print("=" * 60)
print("🔄 PREPROCESSING...")
print("=" * 60)
# Load
print("\n📊 Load data (samui_load):")
df_load = preprocess_load_data(data['load'])
print(f" Shape: {df_load.shape}")
print(f" Date range: {df_load['datetime'].min()} to {df_load['datetime'].max()}")
print(f" MW range: {df_load['mw'].min():.2f} - {df_load['mw'].max():.2f} MW")
print(f" Sample:\n{df_load.head(3)}")
# Temperature
print("\n🌡️ Temperature data (MAX_TEMP_BY_DAY):")
df_temp = preprocess_temperature_data(data['temp'])
print(f" Shape: {df_temp.shape}")
print(f" Date range: {df_temp['date'].min()} to {df_temp['date'].max()}")
if 'max_temp' in df_temp.columns:
print(f" Max_Temp range: {df_temp['max_temp'].min():.2f} - {df_temp['max_temp'].max():.2f}°C")
if 'fiber_temp' in df_temp.columns:
print(f" Fiber_Temp range: {df_temp['fiber_temp'].min():.2f} - {df_temp['fiber_temp'].max():.2f}°C")
print(f" Sample:\n{df_temp.head(3)}")
# Measurements
print("\n📏 TEPR data (MEASUREMENT_TEPR):")
df_tepr = preprocess_measurement_data(data['tepr'], param_type='TEPR')
print(f" Shape: {df_tepr.shape}")
if len(df_tepr) > 0:
print(f" Distances: {len(df_tepr['distance'].unique())} unique")
print(f" VALUE stats - Mean: {df_tepr['TEPR_mean'].mean():.2f}, Std: {df_tepr['TEPR_std'].mean():.2f}")
print(f" Sample:\n{df_tepr.head(3)}")
print("\n📏 STRR data (MEASUREMENT_STRR):")
df_strr = preprocess_measurement_data(data['strr'], param_type='STRR')
print(f" Shape: {df_strr.shape}")
if len(df_strr) > 0:
print(f" Distances: {len(df_strr['distance'].unique())} unique")
print(f" VALUE stats - Mean: {df_strr['STRR_mean'].mean():.2f}, Std: {df_strr['STRR_std'].mean():.2f}")
print(f" Sample:\n{df_strr.head(3)}")
# ========== AGGREGATE & MERGE ==========
print("\n" + "=" * 60)
print("🔗 AGGREGATION & MERGING...")
print("=" * 60)
# Daily aggregate
print("\n📈 Aggregating load to daily max...")
df_daily = aggregate_daily_max(df_load)
print(f" Shape: {df_daily.shape}")
print(f" Date range: {df_daily['date'].min()} to {df_daily['date'].max()}")
print(f" mw_max range: {df_daily['mw_max'].min():.2f} - {df_daily['mw_max'].max():.2f} MW")
print(f" mw_theoretical_80pct range: {df_daily['mw_theoretical_80pct'].min():.2f} - {df_daily['mw_theoretical_80pct'].max():.2f} MW")
print(f" Sample:\n{df_daily.head(3)}")
# Merge load + temp
print("\n🔗 Merging load + temperature...")
df_merged = merge_load_temp(df_daily, df_temp)
print(f" Shape: {df_merged.shape}")
print(f" Columns: {list(df_merged.columns)}")
print(f" Sample:\n{df_merged.head(3)}")
# Merge with measurements
print("\n🔗 Adding measurements (TEPR/STRR statistics)...")
df_final = merge_with_measurements(df_merged, df_tepr, df_strr)
print(f" Shape: {df_final.shape}")
print(f" Columns: {list(df_final.columns)}")
print(f" mw_max range: {df_final['mw_max'].min():.2f} - {df_final['mw_max'].max():.2f} MW ✅")
print(f" mw_theoretical_80pct range: {df_final['mw_theoretical_80pct'].min():.2f} - {df_final['mw_theoretical_80pct'].max():.2f} MW ✅")
print(f" Sample:\n{df_final.head(3)}")
print("\n" + "=" * 60)
print("✅ PIPELINE SUCCESS!")
print("=" * 60)
print(f"Final data shape: {df_final.shape}")
print(f"Final mw_max reasonable? {df_final['mw_max'].max() < 100}")
except Exception as e:
print(f"\n❌ ERROR: {e}")
import traceback
traceback.print_exc()
sys.exit(1)