在 python 中创建一个带有"while"循环的函数,并使用该函数在数据框中生成一个新列



我尝试创建一个带有"while"在Python中,

def pmv_calculator(ta, tr, vel, rh, met, clo, wme):
pa = rh * 10 * np.exp(16.6536 - 4030.183 / (ta + 235))
icl = 0.155 * clo
m = met * 58.15
w = wme * 58.15
mw = m - w
if icl <= 0.078:
fcl = 1 + (1.29 * icl)
else:
fcl = 1.05 + (0.645 * icl)
hcf = 12.1 * np.sqrt(vel)
taa = ta + 273
tra = tr + 273
tcla = taa + (35.5 - ta) / (3.5 * icl + 0.1)
p1 = icl * fcl
p2 = p1 * 3.96
p3 = p1 * 100
p4 = p1 * taa
p5 = 308.7 - 0.028 * mw + p2 * np.power(tra / 100, 4)
xn = tcla / 100
xf = tcla / 50
eps = 0.00015
hc = 0
n = 0
while abs(xn - xf) > eps:
xf = (xf + xn) / 2
hcn = 2.38 * np.power(abs(100.0 * xf - taa), 0.25)
if hcf > hcn:
hc = hcf
else:
hc = hcn
xn = (p5 + p4 * hc - p2 * np.power(xf, 4)) / (100 + p3 * hc)
n += 1
if n > 150:
print('Max iteration exceeded')
break
tcl = 100 * xn - 273
h11 = 3.05 * 0.001 * (5733 - (6.99 * mw) - pa)
if mw > 58.15:
h12 = 0.42 * (mw - 58.15)
else:
h12 = 0
h13 = 1.7 * 0.00001 * m * (5867 - pa)
h14 = 0.0014 * m * (34 - ta)
h15 = 3.96 * fcl * (np.power(xn, 4) - np.power(tra / 100, 4))
h16 = fcl * hc * (tcl - ta)
ts = 0.303 * np.exp(-0.036 * m) + 0.028
pmv = ts * (mw - h11 - h12 - h13 - h14 - h15 - h16)
return pmv

然后使用这个函数在我的数据框架中生成另一列。

df['PMV'] = pmv_calculator(df['temp'], df['temp'], 0.1, 22, 1.1, 1, 0)

但是它给了我以下错误:

文件"C:/p .py",第119行,在df['PMV'] = pmv_calculator(df['temp'], df['temp'], Air_Speed, 22, Metabolic_Rate, Clothing, 0)文件"C:/P.py",第83行,在pmv_calculator而abs(xn - xf)>每股收益:文件"C:PAvenvlibsite-packagespandascoregeneric.py",第1538行,在nonzero{type(self).name的真值}是模棱两可的。";ValueError: Series的真值是不明确的。使用a.empty a.bool (), a.item (), a.any()或所有()。

当我简单地放入数字而不是数据框架列时,函数工作得很好。当我尝试创建新列时,错误才出现。我写了"while"。循环"|"但这并没有奏效。我不知道怎样才能修好它。

错误是由于这一行

while abs(xn - xf) > eps:

这种类型的比较最适合于单个值。但是在一个数据帧中,你有多个值,所以这行不通。在您的情况下,最佳解决方案是使用df.apply()。这将分别对每一行应用pmv_calculator函数。

df['PMV'] = df.apply( lambda x : pmv_calculator(x['temp'], x['temp'], 0.1, 22, 1.1, 1, 0), axis=1)

最新更新