增加经济优化功能。
This commit is contained in:
288
excel_reader.py
288
excel_reader.py
@@ -219,6 +219,26 @@ def read_excel_data(file_path: str, sheet_name: str = 0, include_parameters: boo
|
||||
except Exception as e:
|
||||
print(f"读取系统参数失败,使用默认参数:{str(e)}")
|
||||
result['system_parameters'] = SystemParameters()
|
||||
|
||||
try:
|
||||
result['economic_parameters'] = read_economic_parameters(file_path)
|
||||
print("成功读取经济参数")
|
||||
except Exception as e:
|
||||
print(f"读取经济参数失败,使用默认参数:{str(e)}")
|
||||
from economic_optimization import EconomicParameters
|
||||
result['economic_parameters'] = EconomicParameters()
|
||||
|
||||
try:
|
||||
result['optimization_settings'] = get_optimization_settings(file_path)
|
||||
print("成功读取优化设置")
|
||||
except Exception as e:
|
||||
print(f"读取优化设置失败,使用默认设置:{str(e)}")
|
||||
result['optimization_settings'] = {
|
||||
'storage_capacity_range': (0, 1000),
|
||||
'rate_range': (0.1, 2.0),
|
||||
'max_iterations': 100,
|
||||
'tolerance': 0.01
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
@@ -370,16 +390,112 @@ def create_excel_template(file_path: str, data_type: str = "8760"):
|
||||
})
|
||||
parameters_df.to_excel(writer, sheet_name='参数', index=False)
|
||||
|
||||
# 添加经济参数工作表
|
||||
economic_params_df = pd.DataFrame({
|
||||
'参数名称': [
|
||||
'光伏建设成本',
|
||||
'风电建设成本',
|
||||
'储能建设成本',
|
||||
'购电价格',
|
||||
'上网电价',
|
||||
'光伏运维成本',
|
||||
'风电运维成本',
|
||||
'储能运维成本',
|
||||
'项目寿命',
|
||||
'折现率',
|
||||
'储能容量搜索范围-最小值',
|
||||
'储能容量搜索范围-最大值',
|
||||
'充放电倍率搜索范围-最小值',
|
||||
'充放电倍率搜索范围-最大值',
|
||||
'最大迭代次数',
|
||||
'收敛容差'
|
||||
],
|
||||
'参数值': [
|
||||
3000000, # 光伏建设成本 (元/MW)
|
||||
2500000, # 风电建设成本 (元/MW)
|
||||
800000, # 储能建设成本 (元/MWh)
|
||||
600, # 购电价格 (元/MWh)
|
||||
400, # 上网电价 (元/MWh)
|
||||
50000, # 光伏运维成本 (元/MW/年)
|
||||
45000, # 风电运维成本 (元/MW/年)
|
||||
3000, # 储能运维成本 (元/MW/年)
|
||||
25, # 项目寿命 (年)
|
||||
0.08, # 折现率
|
||||
0, # 储能容量搜索范围-最小值 (MWh)
|
||||
1000, # 储能容量搜索范围-最大值 (MWh)
|
||||
0.1, # 充放电倍率搜索范围-最小值
|
||||
2.0, # 充放电倍率搜索范围-最大值
|
||||
100, # 最大迭代次数
|
||||
0.01 # 收敛容差
|
||||
],
|
||||
'参数说明': [
|
||||
'光伏发电系统建设成本 (元/MW)',
|
||||
'风力发电系统建设成本 (元/MW)',
|
||||
'储能系统建设成本 (元/MWh)',
|
||||
'从电网购电价格 (元/MWh)',
|
||||
'向电网售电价格 (元/MWh)',
|
||||
'光伏系统年度运维成本 (元/MW/年)',
|
||||
'风电系统年度运维成本 (元/MW/年)',
|
||||
'储能系统年度运维成本 (元/MW/年)',
|
||||
'项目运营寿命 (年)',
|
||||
'项目折现率 (用于NPV计算)',
|
||||
'储能容量优化搜索范围下限 (MWh)',
|
||||
'储能容量优化搜索范围上限 (MWh)',
|
||||
'充放电倍率优化搜索范围下限',
|
||||
'充放电倍率优化搜索范围上限',
|
||||
'优化算法最大迭代次数',
|
||||
'优化算法收敛容差'
|
||||
],
|
||||
'取值范围': [
|
||||
'>0',
|
||||
'>0',
|
||||
'>0',
|
||||
'>0',
|
||||
'≥0',
|
||||
'≥0',
|
||||
'≥0',
|
||||
'≥0',
|
||||
'>0',
|
||||
'0-1',
|
||||
'≥0',
|
||||
'>0',
|
||||
'>0',
|
||||
'>0',
|
||||
'>0',
|
||||
'>0'
|
||||
],
|
||||
'默认值': [
|
||||
'3,000,000',
|
||||
'2,500,000',
|
||||
'800,000',
|
||||
'600',
|
||||
'400',
|
||||
'50,000',
|
||||
'45,000',
|
||||
'3,000',
|
||||
'25',
|
||||
'0.08',
|
||||
'0',
|
||||
'1000',
|
||||
'0.1',
|
||||
'2.0',
|
||||
'100',
|
||||
'0.01'
|
||||
]
|
||||
})
|
||||
economic_params_df.to_excel(writer, sheet_name='经济参数', index=False)
|
||||
|
||||
# 添加说明工作表
|
||||
description_df = pd.DataFrame({
|
||||
'项目': ['数据说明', '数据类型', '时间范围', '单位', '注意事项', '参数说明'],
|
||||
'项目': ['数据说明', '数据类型', '时间范围', '单位', '注意事项', '参数说明', '经济优化说明'],
|
||||
'内容': [
|
||||
description,
|
||||
f'{data_type}小时电力数据',
|
||||
f'1-{hours}小时',
|
||||
'MW (兆瓦)',
|
||||
'所有数值必须为非负数',
|
||||
'系统参数请在"参数"工作表中修改'
|
||||
'系统参数请在"参数"工作表中修改',
|
||||
'经济优化参数请在"经济参数"工作表中修改'
|
||||
]
|
||||
})
|
||||
description_df.to_excel(writer, sheet_name='说明', index=False)
|
||||
@@ -426,6 +542,148 @@ def analyze_excel_data(file_path: str) -> Dict[str, float]:
|
||||
return {}
|
||||
|
||||
|
||||
def read_economic_parameters(file_path: str):
|
||||
"""
|
||||
从Excel文件读取经济参数
|
||||
|
||||
Args:
|
||||
file_path: Excel文件路径
|
||||
|
||||
Returns:
|
||||
EconomicParameters对象
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: 文件不存在
|
||||
ValueError: 参数格式错误
|
||||
"""
|
||||
from economic_optimization import EconomicParameters
|
||||
|
||||
# 检查文件是否存在
|
||||
if not os.path.exists(file_path):
|
||||
raise FileNotFoundError(f"文件不存在:{file_path}")
|
||||
|
||||
try:
|
||||
# 读取经济参数工作表
|
||||
df_params = pd.read_excel(file_path, sheet_name='经济参数')
|
||||
|
||||
# 验证经济参数工作表格式
|
||||
required_columns = ['参数名称', '参数值', '参数说明']
|
||||
missing_columns = [col for col in required_columns if col not in df_params.columns]
|
||||
|
||||
if missing_columns:
|
||||
raise ValueError(f"经济参数工作表缺少必需的列:{missing_columns}")
|
||||
|
||||
# 提取参数值
|
||||
params_dict = {}
|
||||
for _, row in df_params.iterrows():
|
||||
param_name = row['参数名称']
|
||||
param_value = row['参数值']
|
||||
|
||||
# 跳过空行
|
||||
if pd.isna(param_name) or pd.isna(param_value):
|
||||
continue
|
||||
|
||||
# 转换参数值
|
||||
try:
|
||||
if isinstance(param_value, str):
|
||||
# 尝试转换为浮点数
|
||||
param_value = float(param_value)
|
||||
params_dict[param_name] = param_value
|
||||
except (ValueError, TypeError):
|
||||
raise ValueError(f"经济参数 '{param_name}' 的值 '{param_value}' 不是有效的数值")
|
||||
|
||||
# 读取各参数值,如果找不到则使用默认值
|
||||
get_param_value = lambda param_name: df_params.loc[df_params['参数名称'] == param_name, '参数值'].iloc[0] if param_name in df_params['参数名称'].values else None
|
||||
|
||||
try:
|
||||
# 获取各参数值,区分None、NaN、0和有效值
|
||||
def get_param_with_default(param_name, default_value):
|
||||
value = get_param_value(param_name)
|
||||
if value is None or pd.isna(value):
|
||||
return default_value
|
||||
else:
|
||||
return value
|
||||
|
||||
return EconomicParameters(
|
||||
solar_capex=get_param_with_default('光伏建设成本', 3000000),
|
||||
wind_capex=get_param_with_default('风电建设成本', 2500000),
|
||||
storage_capex=get_param_with_default('储能建设成本', 800000),
|
||||
electricity_price=get_param_with_default('购电价格', 600),
|
||||
feed_in_price=get_param_with_default('上网电价', 400),
|
||||
solar_om=get_param_with_default('光伏运维成本', 50000),
|
||||
wind_om=get_param_with_default('风电运维成本', 45000),
|
||||
storage_om=get_param_with_default('储能运维成本', 3000),
|
||||
project_lifetime=int(get_param_with_default('项目寿命', 25)),
|
||||
discount_rate=get_param_with_default('折现率', 0.08)
|
||||
)
|
||||
except (KeyError, IndexError, Exception) as e:
|
||||
print(f"读取经济参数失败:{str(e)},使用默认参数")
|
||||
return EconomicParameters(
|
||||
solar_capex=3000000,
|
||||
wind_capex=2500000,
|
||||
storage_capex=800000,
|
||||
electricity_price=600,
|
||||
feed_in_price=400,
|
||||
solar_om=50000,
|
||||
wind_om=45000,
|
||||
storage_om=3000,
|
||||
project_lifetime=25,
|
||||
discount_rate=0.08
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
print(f"读取经济参数工作表失败,使用默认参数:{str(e)}")
|
||||
# 如果经济参数工作表不存在或读取失败,返回默认参数
|
||||
return EconomicParameters()
|
||||
|
||||
|
||||
def get_optimization_settings(file_path: str) -> Dict[str, Any]:
|
||||
"""
|
||||
从Excel文件读取优化设置参数
|
||||
|
||||
Args:
|
||||
file_path: Excel文件路径
|
||||
|
||||
Returns:
|
||||
优化设置字典
|
||||
"""
|
||||
try:
|
||||
# 读取经济参数工作表
|
||||
df_params = pd.read_excel(file_path, sheet_name='经济参数')
|
||||
|
||||
# 提取优化设置参数
|
||||
get_param_value = lambda param_name: df_params.loc[df_params['参数名称'] == param_name, '参数值'].iloc[0] if param_name in df_params['参数名称'].values else None
|
||||
|
||||
def get_param_with_default(param_name, default_value):
|
||||
value = get_param_value(param_name)
|
||||
if value is None or pd.isna(value):
|
||||
return default_value
|
||||
else:
|
||||
return value
|
||||
|
||||
return {
|
||||
'storage_capacity_range': (
|
||||
get_param_with_default('储能容量搜索范围-最小值', 0),
|
||||
get_param_with_default('储能容量搜索范围-最大值', 1000)
|
||||
),
|
||||
'rate_range': (
|
||||
get_param_with_default('充放电倍率搜索范围-最小值', 0.1),
|
||||
get_param_with_default('充放电倍率搜索范围-最大值', 2.0)
|
||||
),
|
||||
'max_iterations': int(get_param_with_default('最大迭代次数', 100)),
|
||||
'tolerance': get_param_with_default('收敛容差', 0.01)
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
print(f"读取优化设置失败,使用默认设置:{str(e)}")
|
||||
return {
|
||||
'storage_capacity_range': (0, 1000),
|
||||
'rate_range': (0.1, 2.0),
|
||||
'max_iterations': 100,
|
||||
'tolerance': 0.01
|
||||
}
|
||||
|
||||
|
||||
def validate_system_parameters(params: SystemParameters) -> Dict[str, Any]:
|
||||
"""
|
||||
验证系统参数的有效性
|
||||
@@ -492,6 +750,32 @@ def validate_system_parameters(params: SystemParameters) -> Dict[str, Any]:
|
||||
|
||||
def main():
|
||||
"""主函数,演示Excel数据读取功能"""
|
||||
import sys
|
||||
|
||||
# 检查命令行参数
|
||||
if len(sys.argv) > 1 and sys.argv[1] == '--economic':
|
||||
print("=== 创建经济优化Excel模板 ===")
|
||||
|
||||
# 创建经济优化模板文件
|
||||
economic_template_8760 = "economic_data_template_8760.xlsx"
|
||||
economic_template_24 = "economic_data_template_24.xlsx"
|
||||
|
||||
print("\n1. 创建经济优化Excel模板文件...")
|
||||
create_excel_template(economic_template_8760, "8760")
|
||||
create_excel_template(economic_template_24, "24")
|
||||
|
||||
print(f"\n[OK] 经济优化Excel模板创建完成!")
|
||||
print(f"[FILE] 8760小时模板: {economic_template_8760}")
|
||||
print(f"[FILE] 24小时模板: {economic_template_24}")
|
||||
print(f"\n[INFO] 模板包含以下工作表:")
|
||||
print(f" 1. 数据 - 8760小时电力数据")
|
||||
print(f" 2. 参数 - 系统运行参数")
|
||||
print(f" 3. 经济参数 - 经济优化参数")
|
||||
print(f" 4. 说明 - 使用说明")
|
||||
print(f"\n[USAGE] 使用方法:")
|
||||
print(f" uv run python economic_optimization.py --excel {economic_template_8760}")
|
||||
return
|
||||
|
||||
print("=== Excel数据读取模块演示 ===")
|
||||
|
||||
# 创建模板文件
|
||||
|
||||
Reference in New Issue
Block a user