#!/usr/bin/env python3 # -*- coding: utf-8 -*- """测试多场景聚类模块""" import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), 'src')) from multi_scenario import MultiScenarioAnalyzer import numpy as np def test_multi_scenario_basic(): """测试基本功能""" print("测试多场景聚类基本功能...") # 生成简单的测试数据(24小时) hours = 24 solar_output = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] wind_output = [2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0] load_demand = [3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 18.0, 16.0, 14.0, 12.0, 10.0, 8.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0] # 创建分析器 analyzer = MultiScenarioAnalyzer(n_clusters=3, random_state=42) try: # 执行聚类分析 result = analyzer.fit_predict(solar_output, wind_output, load_demand) print("✅ 基本聚类测试通过") print(f" - 识别场景数: {result.n_scenarios}") print(f" - 轮廓系数: {result.silhouette_score:.3f}") print(f" - 场景名称: {result.scenario_names}") return True except Exception as e: print(f"❌ 测试失败: {str(e)}") import traceback traceback.print_exc() return False def test_multi_scenario_yearly(): """测试年度数据聚类""" print("\n测试年度数据聚类...") # 生成模拟的8760小时数据 np.random.seed(42) # 简单的模拟数据 solar_output = [] wind_output = [] load_demand = [] for day in range(365): # 光伏:白天有出力,夜间为0 daily_solar = [0.0] * 6 + list(np.random.uniform(1, 6, 12)) + [0.0] * 6 solar_output.extend(daily_solar) # 风电:相对随机 daily_wind = np.random.exponential(2.5, 24).tolist() wind_output.extend(daily_wind) # 负荷:日内变化,夜间低,白天高 daily_load = [3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 18.0, 16.0, 14.0, 12.0, 10.0, 8.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 2.0] load_demand.extend(daily_load) try: analyzer = MultiScenarioAnalyzer(n_clusters=5, random_state=42) result = analyzer.fit_predict(solar_output, wind_output, load_demand, find_optimal_k=True) print("✅ 年度数据聚类测试通过") print(f" - 最优聚类数: {result.n_scenarios}") print(f" - 轮廓系数: {result.silhouette_score:.3f}") # 输出前3个场景的统计 for i in range(min(3, result.n_scenarios)): stats = result.scenario_stats[f'scenario_{i}'] print(f" - 场景{i+1}: 频率{stats['frequency']:.1%}, " f"光伏{stats['solar_mean']:.1f}MW, " f"风电{stats['wind_mean']:.1f}MW, " f"负荷{stats['load_mean']:.1f}MW") # 测试图表生成 print(" - 测试图表生成...") analyzer.plot_scenario_analysis(result, solar_output, wind_output, load_demand, save_path="test_scenario_analysis.png") print(" ✅ 图表生成成功") return True except Exception as e: print(f"❌ 年度数据测试失败: {str(e)}") import traceback traceback.print_exc() return False def test_data_validation(): """测试数据验证""" print("\n测试数据验证...") # 测试数据长度不一致 try: analyzer = MultiScenarioAnalyzer(n_clusters=2) analyzer.fit_predict([1, 2, 3], [1, 2], [1, 2, 3]) # 长度不一致 print("❌ 应该检测到数据长度不一致") return False except ValueError as e: print("✅ 正确检测到数据长度不一致") return True if __name__ == "__main__": print("=== 多场景聚类模块测试 ===\n") success = True success &= test_multi_scenario_basic() success &= test_multi_scenario_yearly() success &= test_data_validation() print(f"\n{'='*50}") if success: print("🎉 所有测试通过!多场景聚类模块工作正常。") else: print("💥 部分测试失败,请检查代码。") print(f"{'='*50}")