修正没有利用--excel参数的bug。
This commit is contained in:
131
tests/test_multi_scenario.py
Normal file
131
tests/test_multi_scenario.py
Normal file
@@ -0,0 +1,131 @@
|
||||
#!/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}")
|
||||
Reference in New Issue
Block a user