光伏系统建模:如何生成温度损耗列表并优化循环效率
光伏系统温度功率损耗计算优化方案
你的代码存在两个核心问题:
- 逻辑错误:
calc_temp_loss函数中,当判断irr>0时,使用的是整个module_tempSeries(而非当前irr对应的单个温度值),导致每次循环返回的都是完整的温度损耗数组,最终power_loss_list里的每个元素都是数组(和你截图里的输出一致)。 - 效率问题:手动遍历8760个值完全没必要,pandas支持向量化运算,能一次性完成所有计算,比循环高效得多。
修正后的代码(向量化实现)
import pandas as pd # 计算总辐照度 total_irr = df['Direct Irradiance'] + df['Diffuse Irradiance'] # 计算组件温度(向量化运算,直接生成Series) module_temp = t_dry + (((noct - 20)/800) * total_irr) # 向量化计算温度损耗:总辐照度为0时损耗0,否则按公式计算 temp_loss = pd.Series(0, index=total_irr.index) temp_loss[total_irr > 0] = (module_temp[total_irr > 0] - 25) * power_coeff # 直接转为DataFrame列(无需先存列表) df['temp_loss'] = temp_loss
代码说明
- 全程使用pandas的向量化操作,无需循环,一次计算完成8760个值的处理,效率远高于遍历。
- 通过布尔索引
total_irr > 0精准定位需要计算损耗的行,直接赋值对应结果,其余行保持0。 - 直接将结果存入原DataFrame,省去了手动维护列表的步骤。
另一种简洁写法(用numpy.where)
如果习惯更紧凑的代码,可以用numpy.where实现:
import numpy as np total_irr = df['Direct Irradiance'] + df['Diffuse Irradiance'] module_temp = t_dry + (((noct - 20)/800) * total_irr) temp_loss = np.where(total_irr > 0, (module_temp - 25) * power_coeff, 0) df['temp_loss'] = temp_loss
这种写法同样是向量化运算,逻辑更紧凑,判断和计算一步完成。
内容的提问来源于stack exchange,提问作者Joe Baylay
相关产品推荐
相关产品推荐

